21.1 Stringオブジェクト(String Objects)
21.1.1 Stringコンストラクター(The String Constructor)
Stringコンストラクターは、次のような特徴があります。
- 組み込みオブジェクト%String%です。
- グローバルオブジェクトの「String」プロパティの初期値です。
- コンストラクターとして呼び出されると、新しいStringオブジェクトを作成して初期化します。
- 関数として呼び出されると型変換を実行します。
- サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。サブクラスコンストラクターには、[[StringData]]内部スロットとサブクラスインスタンスを作成および初期化するためにStringコンストラクターへのsuperコールを含める必要があります。
21.1.1.1 String ( value )
String が引数 value で呼び出されると、次の手順が実行されます。
- value が存在しないなら、 empty String を s とする
- 1. と異なるなら、
- NewTarget が undefined で Type(value) が Symbol型 なら、 SymbolDescriptiveString(value) を返す
- ? ToString(value) を s とする
- NewTarget が undefined なら、 s を返す
- ! StringCreate(s, ? GetPrototypeFromConstructor(NewTarget, "%String.prototype%")) を返す
21.1.2 Stringコンストラクターのプロパティ(Properties of the String Constructor)
Stringコンストラクターは、次のような特徴があります。
- [[Prototype]]内部スロットがあり、値が%Function.prototype%であるます。
- 次のプロパティがあります。
21.1.2.1 String.fromCharCode ( ...codeUnits )
String.fromCharCode関数は、レストパラメーターcodeUnitsを形成する任意の数の引数を使用して呼び出すことができます。 次の手順が実行されます。
fromCharCode の "length"プロパティは 1 です。
21.1.2.2 String.fromCodePoint ( ...codePoints )
String.fromCodePoint関数は、レストパラメーターcodePointsを形成する任意の数の引数を使用して呼び出すことができます。 次の手順が実行されます。
- 関数に渡された引数List を codePoints とする
- codePoints の要素数を length とする
- 空の新規List を elements とする
- 0 を nextIndex とする
- nextIndex < length の間繰り返し
- codePoints[nextIndex] を next とする
- ? ToNumber(next) を nextCP とする
- ! IsInteger(nextCP) が false なら、RangeError例外をスローする
- If nextCP < 0 または nextCP > 0x10FFFF なら RangeError例外をスローする
- nextCP の UTF16Encoding の要素を elements の最後に追加する
- nextIndex + 1 を nextIndex にセットする
- elements内の要素をコードユニットとして順番に並べたString値を返す。 長さが0の場合、空の文字列を返す。
fromCodePoint の "length"プロパティは 1 です。
21.1.2.3 String.prototype
String.prototypeの初期値は%String.prototype%です。
このプロパティの属性は{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}です。
21.1.2.4 String.raw ( template, ...substitutions )
String.raw関数は、可変数の引数を使用して呼び出すことができます。 最初の引数はテンプレートで、残りの引数は置換値のリストです。 次の手順が実行されます。
- 2番目以降の引数のList を substitutions とする。2番目以降の引数がないなら、Listは空
- substitutions の要素数を numberOfSubstitutions とする
- ? ToObject(template) を cooked とする
- ? ToObject(? Get(cooked, "raw")) を raw とする
- ? LengthOfArrayLike(raw) を literalSegments とする
- literalSegments ≦ 0 なら empty String を返す
- 空の新規List を stringElements とする
- 0 を nextIndex とする
- 繰り返す
- ! ToString(nextIndex) を nextKey とする
- ? ToString(? Get(raw, nextKey)) を nextSeg とする
- nextSeg のコードユニット要素を順番に stringElements の最後に追加する
- nextIndex + 1 = literalSegments なら、
- stringElementsの要素をコードユニットとして順番に並べた String値を返す
- nextIndex < numberOfSubstitutions なら substitutions[nextIndex] を next とする
- e. と異なるなら、 empty String を next とする
- ? ToString(next) を nextSub とする
- nextSub の要素を順番にコードユニットとして stringElements の最後に追加する
- nextIndex + 1 を nextIndex にセットする
21.1.3 Stringプロトタイプオブジェクトのプロパティ(Properties of the String Prototype Object)
Stringプロトタイプオブジェクトは、次のような特徴があります。
- 組み込みオブジェクト%StringPrototype%です。
- Stringエキゾチックオブジェクトであり、指定された内部メソッドがあります。
- [[StringData]]内部スロットがあり、その値は空の文字列です。
- "length"プロパティがあります。初期値は0です。属性は{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}です
- [[Prototype]]内部スロットがあり、値は%Object.prototype%です。
特に明記されていない限り、以下で定義されているStringプロトタイプオブジェクトのメソッドは汎用的ではありません。this値は、String値か、String値で初期化された[[StringData]]内部スロットを持つオブジェクトである必要があります。
抽象操作thisStringValue(value)は、次の手順を実行します。
21.1.3.1 String.prototype.charAt ( pos )
charAt が引数 pos で呼び出されると、次の手順が実行されます。
21.1.3.2 String.prototype.charCodeAt ( pos )
charCodeAt が引数 pos で呼び出されると、次の手順が実行されます。
21.1.3.3 String.prototype.codePointAt ( pos )
codePointAt が引数 pos で呼び出されると、次の手順が実行されます。
- ? RequireObjectCoercible(this値) を O とする
- ? ToString(O) を S とする
- ? ToInteger(pos) を position とする
- S の長さを size とする
- position < 0 または position ≧ size なら undefined を返す
- ! CodePointAt(S, position) を cp とする
- cp.[[CodePoint]] を返す
21.1.3.4 String.prototype.concat ( ...args )
concatメソッドが0個以上の引数で呼び出されると、次の手順が実行されます。
concat method の "length"プロパティは 1 です。
21.1.3.5 String.prototype.constructor
String.prototype.constructorの初期値は%String%です。
21.1.3.6 String.prototype.endsWith ( searchString [ , endPosition ] )
次の手順が実行されます。
- ? RequireObjectCoercible(this値) を O とする
- ? ToString(O) を S とする
- ? IsRegExp(searchString) を isRegExp とする
- isRegExp が true なら、TypeError例外をスローする
- ? ToString(searchString) を searchStr とする
- S の長さを len とする
- endPosition が undefined なら、 len を、異なるなら ? ToInteger(endPosition) を pos とする
- min(max(pos, 0), len) を end とする
- searchStr の長さを searchLength とする
- end - searchLength を start とする
- start が0未満 なら、 false を返す
- s の startから長さsearchLengthのコードユニットシーケンスがsearchStrのコードユニットシーケンスと完全に同じなら、true を返す
- false を返す
21.1.3.7 String.prototype.includes ( searchString [ , position ] )
includes は 二つ の引数 searchString と position を取り、次の手順を実行します。
- ? RequireObjectCoercible(this値) を O とする
- ? ToString(O) を S とする
- ? IsRegExp(searchString) を isRegExp とする
- isRegExp が true なら、TypeError例外をスローする
- ? ToString(searchString) を searchStr とする
- ? ToInteger(position) を pos とする
- Assert: position が undefined なら、 pos は 0
- S の長さを len とする
- min(max(pos, 0), len) を start とする
- searchStr の長さを searchLen とする
- kがstart以上の整数で、k + searchLenがlen以下とする。jをsearchLenより小さいすべての非負の整数とし、S内のインデックスk + jのコードユニットとsearchStr内のインデックスjのコードユニットが同じkが存在するなら、trueを返す。 そのような整数kがない場合は、falseを返す
ようするに文字列S内に、searchStrがあるかどうか
21.1.3.8 String.prototype.indexOf ( searchString [ , position ] )
indexOf は 二つ の引数 searchString と position を取り、次の手順を実行します。
- ? RequireObjectCoercible(this値) を O とする
- ? ToString(O) を S とする
- ? ToString(searchString) を searchStr とする
- ? ToInteger(position) を pos とする
- Assert: position が undefined なら、 pos は 0
- S の長さを len とする
- min( max(pos, 0), len) を start とする
- searchStr の長さを searchLen とする
- kがstart以上の整数で、k + searchLenがlen以下とする。jをsearchLenより小さいすべての非負の整数とし、S内のインデックスk + jのコードユニットとsearchStr内のインデックスjのコードユニットが同じkが存在するなら、最小のkを返す。 そのような整数kがない場合は、値-1を返す
ようするに文字列S内に、searchStrがあるかどうか
21.1.3.9 String.prototype.lastIndexOf ( searchString [ , position ] )
lastIndexOf は 二つ の引数 searchString と position を取り、次の手順を実行します。
- ? RequireObjectCoercible(this値) を O とする
- ? ToString(O) を S とする
- ? ToString(searchString) を searchStr とする
- ? ToNumber(position) を numPos とする
- Assert: position が undefined なら、 numPos は NaN
- numPos が NaN なら、 +∞ を、異なるなら、! ToInteger(numPos) を pos とする
- S の長さを len とする
- min( max(pos, 0), len) を start とする
- searchStr の長さを searchLen とする
- kがstart以下の整数で、k + searchLenがlen以下とする。jをsearchLenより小さいすべての非負の整数とし、S内のインデックスk + jのコードユニットとsearchStr内のインデックスjのコードユニットが同じkが存在するなら、最大のkを返す。 そのような整数kがない場合は、値-1を返す
ようするに文字列S内に、searchStrがあるかどうか
21.1.3.10 String.prototype.localeCompare ( that [ , reserved1 [ , reserved2 ] ] )
ECMA-402国際化APIを含むECMAScript実装は、ECMA-402仕様で指定されているようにlocaleCompareメソッドを実装する必要があります。 ECMAScript実装にECMA-402APIが含まれていない場合は、localeCompareメソッドの次の仕様が使用されます。
引数thatを指定してlocaleCompareメソッドを呼び出すと、それぞれ文字列に変換したthis値とthatのロケールに依存した文字列比較の結果を表すNaN以外の数値が返されます。 2つの文字列をSとThatとします。 2つの文字列は、実装定義の方法で比較されます。 結果は、ホストのデフォルトロケールで指定された並べ替え順序で文字列値を並べ替えることを目的としており、Sが前に来るか、文字列が等しいか、Sが後に来るかに応じて、負、ゼロ、または正になります。 それぞれソート順です。
比較を実行する前に、次の手順を実行して文字列を準備します。
このメソッドの2番目と3番目のオプションパラメーターは、ECMA-402仕様で定義されています。 ECMA-402サポートを含まない実装では、これらのパラメーター位置に他の解釈を割り当ててはなりません。
localeCompareメソッドは、thisとthatの2つの引数の関数と見なされる場合、すべての文字列セットに対する一貫した比較関数(22.1.3.27で定義)です。
実際の戻り値は、実装者が値に追加情報をエンコードできるように実装定義されていますが、関数はすべての文字列の全順序を定義する必要があります。 この関数は、Unicode標準に従って正規に同等である文字列を同一として扱う必要があり、正規に同等と見なされる文字列を比較する場合は0を返す必要があります。
21.1.3.11 String.prototype.match ( regexp )
match が引数 regexp で呼び出されると、次の手順が実行されます。
21.1.3.12 String.prototype.matchAll ( regexp )
this値の文字列に対して正規表現のマッチをregexpで実行し、イテレータを返します。 各反復結果の値は、マッチの結果を含むArrayオブジェクトです。マッチしなかった場合はnullです。
次の手順が実行されます。
- ? RequireObjectCoercible(this値) を O とする
- regexp が undefined と null でないなら、
- ? ToString(O) を S とする
- ? RegExpCreate(regexp, "g") を rx とする
- ? Invoke(rx, @@matchAll, « S ») を返す
21.1.3.13 String.prototype.normalize ( [ form ] )
normalize が引数 form で呼び出されると、次の手順が実行されます。
21.1.3.14 String.prototype.padEnd ( maxLength [ , fillString ] )
padEnd メソッドが呼び出されると、次の手順が実行されます。
- ? RequireObjectCoercible(this値) を O とする
- ? StringPad(O, maxLength, fillString, end) を返す
21.1.3.15 String.prototype.padStart ( maxLength [ , fillString ] )
padStart メソッドが呼び出されると、次の手順が実行されます。
- ? RequireObjectCoercible(this値) を O とする
- ? StringPad(O, maxLength, fillString, start) を返す
21.1.3.15.1 ランタイムセマンティクス(Runtime Semantics): StringPad ( O, maxLength, fillString, placement )
抽象操作StringPadが引数O、maxLength、fillString、placementを指定して呼び出されると、次の手順が実行されます。
- Assert: placement は start または end
- ? ToString(O) を S とする
- ? ToLength(maxLength) を intMaxLength とする
- S の長さを stringLength とする
- intMaxLength が stringLength 以下なら、 S を返す
- fillString が undefined なら、 コードユニット 0x0020 (SPACE) のみで構成される文字列値を filler とする
- 6. と異なるなら、 ? ToString(fillString) を filler とする
- filler が empty String なら、 S を返す
- intMaxLength - stringLength を fillLen とする
- filler の繰り返し連結を長さfillLen で切り捨てた文字列を truncatedStringFiller とする
- placement が start なら truncatedStringFiller と S の文字列連結を返す
- 11. と異なるなら、 S と truncatedStringFiller の文字列連結を返す
21.1.3.16 String.prototype.repeat ( count )
次の手順が実行されます。
21.1.3.17 String.prototype.replace ( searchValue, replaceValue )
replaceメソッドが引数searchValueとreplaceValueを使用して呼び出されると、次の手順が実行されます。
- ? RequireObjectCoercible(this値) を O とする
- searchValue が undefined と null でないなら、
- ? ToString(O) を string とする
- ? ToString(searchValue) を searchString とする
- IsCallable(replaceValue) を functionalReplace とする
- functionalReplace が false なら、
- stringからsearchStringを検索し、最初に一致した部分文字列の、最初のコードユニットのインデックスをposとし、searchString を matched とする。 一致しなかった場合は、stringを返す
- functionalReplace が true なら、
- 8. と異なるなら、
- 空の新規List を captures とする
- ! GetSubstitution(matched, string, pos, captures, undefined, replaceValue) を replStr とする
- pos + matchedのコードユニット数を tailPos とする
- stringの最初のposコードユニットと replStr と、インデックス tailPos から末尾までの部分文字列の文字列連結を newString とする。 posが0の場合、連結の最初の要素は空の文字列である
- newString を返す
21.1.3.17.1 ランタイムセマンティクス(Runtime Semantics): GetSubstitution ( matched, str, position, captures, namedCaptures, replacement )
抽象操作GetSubstitution は、次の手順を実行します。
- Assert: Type(matched) は String型
- matched のコードユニット数を matchLength とする
- Assert: Type(str) は String型
- str のコードユニット数を stringLength とする
- Assert: ! IsNonNegativeInteger(position) は true
- Assert: position ≦ stringLength
- Assert: captures は emptyの可能性のある文字列のリスト
- Assert: Type(replacement) は String型
- position + matchLength を tailPos とする
- captures の要素数を m とする
- 表52で指定された置換を実行しながら、replacementからresult にコードユニット要素をコピーすることによってreplacementから派生した文字列値をresult とする。これらの$置換は左から右に実行される。そのような置換が実行されると、新しい置換が実行される。 新しい置換テキストはそれ以上の置換の対象にはならない
- result を返す
コードユニット | ユニコード文字 | 置換テキスト |
---|---|---|
0x0024, 0x0024 | $$ | $ |
0x0024, 0x0026 | $& | matched |
0x0024, 0x0060 | $` | positionが0なら、空の文字列です。 それ以外は、strのコードユニットインデックス0から、position-1 までの文字列です。 |
0x0024, 0x0027 | $' | tailPos ≧ stringLength なら空の文字列です。それ以外の場合、strのコードユニットインデックスtailPosから終わりまでの文字列です。 |
0x0024, N Nは次の範囲 0x0031 ≦ N ≦ 0x0039 |
$n n は 1 2 3 4 5 6 7 8 9 どれかで、 その後に10進数が続かない |
capturesのn番目の要素。nは1桁で、1から9の範囲です。n≦mで、capturesのn番目の要素がundefinedときは、代わりにempty文字列を使用してください。 n > mの場合、置換は行われません。 |
0x0024, N, N Nは次の範囲 0x0030 ≦ N ≦ 0x0039 |
$nn n は 0 1 2 3 4 5 6 7 8 9 どれか |
capturesのnn番目の要素。nnは2桁で、01から99の範囲の10進数です。nn ≦ mで、キャプチャのnn番目の要素がundefinedときは、代わりにempty文字列を使用してください。 nnが00またはnn> mの場合、置換は行われません。 |
0x0024, 0x003C | $< |
|
0x0024 | 上記のいずれにも一致しないコンテキストでの$ | $ |
21.1.3.18 String.prototype.search ( regexp )
search が引数 regexp で呼び出されると、次の手順が実行されます。
21.1.3.19 String.prototype.slice ( start, end )
sliceメソッドは、startとendの2つの引数を取り、thisオブジェクトを文字列に変換した結果の部分文字列を返します。インデックスstartから始まり、end-1まで実行されます。endがundefinedの場合は文字列の終わりまでです。 startが負の場合、sourceLength + startとして扱われます。sourceLengthは文字列の長さです。 endが負の場合、sourceLength + endとして扱われます。 結果はString値であり、Stringオブジェクトではありません。 次の手順が実行されます。
- ? RequireObjectCoercible(this値) を O とする
- ? ToString(O) を S とする
- S の長さを len とする
- ? ToInteger(start) を intStart とする
- end が undefined なら、 len を、異なるなら ? ToInteger(end) を intEnd とする
- intStart < 0 なら max(len + intStart, 0) を、異なるなら min(intStart, len) を from とする
- intEnd < 0 なら max(len + intEnd, 0) を、異なるなら min(intEnd, len) を to とする
- max(to - from, 0) を span とする
- sのインデックスfromからspan個のコードユニット文字列を返す
21.1.3.20 String.prototype.split ( separator, limit )
thisオブジェクトを文字列に変換した結果の部分文字列が格納されている配列オブジェクトを返します。 部分文字列は、separatorを左から右に検索することによって決定されます。 検索された文字列は、返される配列の部分文字列の一部ではありませんが、文字列値を分割するのに役立ちます。 separatorの値は、任意の長さの文字列にすることも、@@splitメソッドを持つRegExpなどのオブジェクトにすることもできます。
split メソッドが呼び出されると、次の手順が実行されます。
- ? RequireObjectCoercible(this値) を O とする
- separator が undefined と null でないなら、
- ? ToString(O) を S とする
- ! ArrayCreate(0) を A とする
- 0 を lengthA とする
- limit が undefined なら 232 - 1 を、異なるなら ? ToUint32(limit) を lim とする
- S の長さを s とする
- 0 を p とする
- ? ToString(separator) を R とする
- lim = 0 なら A を返す
- separator が undefined なら、
- ! CreateDataPropertyOrThrow(A, "0", S) を実行する
- A を返す
- s = 0 なら、
- SplitMatch(S, 0, R) を z とする
- z が false でないなら、 A を返す
- ! CreateDataPropertyOrThrow(A, "0", S) を実行する
- A を返す
- p を q とする
- q ≠ s の間繰り返し
- SplitMatch(S, q, R) を e とする
- e が false なら q + 1 を q にセットする
- b. と異なるなら、
- Assert: e は整数インデックスで s以下
- e = p なら q + 1 を q にセットする
- ii. と異なるなら、
- Sのインデックスpからq-1まのコードユニットで構成される文字列に等しい文字列値をTとする
- ! CreateDataPropertyOrThrow(A, ! ToString(lengthA), T) を実行する
- lengthA + 1 を lengthA にセットする
- lengthA = lim なら A を返す
- e を p にセットする
- p を q にセットする
- Sのインデックスpからs-1のコードユニットで構成される部分文字列に等しい文字列値Tとする
- ! CreateDataPropertyOrThrow(A, ! ToString(lengthA), T) を実行する
- A を返す
separatorの値は空の文字列である可能性があります。 この場合separatorは、入力文字列の最初と最後の空の部分文字列と一致せず、前の区切り文字の最後の空の部分文字列と一致しません。 separatorが空の文字列の場合、文字列は個々のコードユニット要素に分割されます。 結果の配列の長さは文字列の長さと等しく、各部分文字列には1つのコード単位が含まれます。
thisオブジェクトが空の文字列の場合、結果はseparatorが空の文字列と一致するかどうかによって異なります。 可能であれば、結果の配列には要素が含まれていません。 それ以外の場合、結果の配列には空の文字列である1つの要素が含まれます。
separatorがundefinedの場合、結果の配列には、文字列に変換したthis値である文字列が1つだけ含まれます。 limitがundefinedでない場合、limit数を超える配列インデックスは切り捨てられます。
21.1.3.20.1 ランタイムセマンティクス(Runtime Semantics): SplitMatch ( S, q, R )
抽象操作SplitMatchは、文字列S、整数q、文字列Rの3つのパラメーターを取り、falseまたはマッチした終了インデックスを返すために次の手順を実行します。
21.1.3.21 String.prototype.startsWith ( searchString [ , position ] )
次の手順が実行されます。
- ? RequireObjectCoercible(this値) を O とする
- ? ToString(O) を S とする
- ? IsRegExp(searchString) を isRegExp とする
- isRegExp が true なら、TypeError例外をスローする
- ? ToString(searchString) を searchStr とする
- ? ToInteger(position) を pos とする
- Assert: position が undefined なら、 pos は 0
- S の長さを len とする
- min( max(pos, 0), len) を start とする
- searchStr の長さを searchLength とする
- searchLength + start が len より大きいなら、 false を返す
- Sのstartから長さsearchLengthのコードユニットのシーケンスがsearchStrのコードユニットシーケンスと同じである場合、trueを返す
- false を返す
21.1.3.22 String.prototype.substring ( start, end )
substringメソッドは、startとendの2つの引数を取り、thisオブジェクトを文字列に変換した結果の部分文字列を返します。インデックスのstartから始まり、endまで(endがundefinedなら文字列の終わりまで)実行されます。 結果はString値であり、Stringオブジェクトではありません。
いずれかの引数がNaNまたは負の場合、ゼロに置き換えられます。 いずれかの引数が文字列の長さよりも大きい場合は、文字列の長さに置き換えられます。
startがendより大きい場合、それらは交換されます。
次の手順が実行されます。
- ? RequireObjectCoercible(this値) を O とする
- ? ToString(O) を S とする
- S の長さを len とする
- ? ToInteger(start) を intStart とする
- end が undefined なら、 len を、異なるなら ? ToInteger(end) を intEnd とする
- min( max(intStart, 0), len) を finalStart とする
- min( max(intEnd, 0), len) を finalEnd とする
- min(finalStart, finalEnd) を from とする
- max(finalStart, finalEnd) を to とする
- 長さが to - fromで、Sのコードユニット、つまりインデックスfromからto-1のコードユニットを昇順で含む文字列値を返す
21.1.3.23 String.prototype.toLocaleLowerCase ( [ reserved1 [ , reserved2 ] ] )
ECMA-402国際化APIを含むECMAScript実装は、ECMA-402仕様で指定されているようにtoLocaleLowerCaseメソッドを実装する必要があります。 ECMAScript実装にECMA-402APIが含まれていない場合は、toLocaleLowerCaseメソッドの次の仕様が使用されます。
この関数は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。
この関数はtoLowerCaseとまったく同じように機能しますが、その結果はロケールに依存しない結果ではありません。ホスト環境の現在のロケールに対して正しい結果を生成することを目的としています。 その言語のルールが通常のUnicodeケースマッピングと競合するいくつかのケース(トルコ語など)でのみ違いがあります。
このメソッドのオプションのパラメーターの意味は、ECMA-402仕様で定義されています。 ECMA-402サポートを含まない実装では、これらのパラメーター位置を他の目的で使用してはなりません。
21.1.3.24 String.prototype.toLocaleUpperCase ( [ reserved1 [ , reserved2 ] ] )
ECMA-402国際化APIを含むECMAScript実装は、ECMA-402仕様で指定されているようにtoLocaleUpperCaseメソッドを実装する必要があります。 ECMAScript実装にECMA-402APIが含まれていない場合は、toLocaleUpperCaseメソッドの次の仕様が使用されます。
この関数は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。
この関数はtoUpperCaseとまったく同じように機能しますが、その結果はロケールに依存しない結果ではありません。ホスト環境の現在のロケールに対して正しい結果を生成することを目的としています。 その言語のルールが通常のUnicodeケースマッピングと競合するいくつかのケース(トルコ語など)でのみ違いがあります。
このメソッドのオプションのパラメーターの意味は、ECMA-402仕様で定義されています。 ECMA-402サポートを含まない実装では、これらのパラメーター位置を他の目的で使用してはなりません。
21.1.3.25 String.prototype.toLowerCase ( )
この関数は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。 次の手順が実行されます。
- ? RequireObjectCoercible(this値) を O とする
- ? ToString(O) を S とする
- ! UTF16DecodeString(S) を sText とする
- Unicodeの既定の大文字小文字変換アルゴリズムに従ったtoLowercase(sText)の結果を lowerText とする
- ! UTF16Encode(lowerText) を L とする
- L を返す
結果はUnicode文字データベースのロケールに依存しない大文字と小文字のマッピングに従って、導出する必要があります(これにはUnicodeData.txtファイルだけでなく、それに付随するSpecialCasings.txtファイルのすべてのロケールに依存しないマッピングが明示的に含まれます)。
21.1.3.26 String.prototype.toString ( )
toString メソッドが呼び出されると、次の手順が実行されます。
- ? thisStringValue(this値) を返す
21.1.3.27 String.prototype.toUpperCase ( )
この関数は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。
この関数は、StringがUnicodeの既定の大文字小文字変換アルゴリズムのtoUppercaseアルゴリズムを使用してマップされることを除いて、String.prototype.toLowerCaseとまったく同じように動作します。
21.1.3.28 String.prototype.trim ( )
この関数は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。
次の手順が実行されます。
- this値 を S とする
- ? TrimString(S, start+end) を返す
21.1.3.28.1 ランタイムセマンティクス(Runtime Semantics): TrimString ( string, where )
抽象演算TrimStringは、引数stringとwhereを使用して呼び出され、6.1.4で説明されているように、String値文字列をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。
次の手順を実行します。
- ? RequireObjectCoercible(string) を str とする
- ? ToString(str) を S とする
- where が start なら、 先頭の空白が削除されたSのコピー文字列値を T とする
- 3. と異なり where が end なら、末尾の空白が削除されたSのコピー文字列値を T とする
- 4. と異なるなら、
- Assert: where は start+end
- 先頭と末尾の空白が削除されたSのコピー文字列値を T とする
- T を返す
空白の定義は、WhiteSpaceとLineTerminatorの両方です。 UnicodeコードポイントがUnicode一般カテゴリ"Space_Separator"("Zs")にあるかどうかを判断する場合、コードユニットシーケンスは、6.1.4で指定されているUTF-16エンコードコードポイントシーケンスとして解釈されます。
21.1.3.29 String.prototype.trimEnd ( )
この関数は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。
次の手順が実行されます。
- this値 を S とする
- ? TrimString(S, end) を返す
21.1.3.30 String.prototype.trimStart ( )
この関数は、6.1.4で説明されているように、文字列値をUTF-16でエンコードされたコードポイントのシーケンスとして解釈します。
次の手順が実行されます。
- this値 を S とする
- ? TrimString(S, start) を返す
21.1.3.31 String.prototype.valueOf ( )
valueOf メソッドが呼び出されると、次の手順が実行されます。
- ? thisStringValue(this値) を返す
21.1.3.32 String.prototype [ @@iterator ] ( )
@@iteratorメソッドが呼び出されると、String値のコードポイントを反復処理するIteratorオブジェクト(25.1.1.2)が返されます。
次の手順が実行されます。
- ? RequireObjectCoercible(this値) を O とする
- ? ToString(O) を S とする
- CreateStringIterator(S) を返す
この関数の"name"プロパティの値は"[Symbol.iterator]"です。
21.1.4 Stringインスタンスのプロパティ(Properties of String Instances)
StringインスタンスはStringエキゾチックオブジェクトのため、固有の内部メソッドがあります。 Stringインスタンスは、Stringプロトタイプオブジェクトからプロパティを継承します。 Stringインスタンスには、[[StringData]]内部スロットがあります。
Stringインスタンスには、"length"プロパティと、整数インデックス名を持つ列挙可能なプロパティのセットがあります。
21.1.4.1 length
このStringオブジェクトによって表されるString値の要素の数。
一度Stringオブジェクトが初期化されると、このプロパティは変更されません。 属性は{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }です。
21.1.5 Stringイテレータオブジェクト(String Iterator Objects)
Stringイテレータはオブジェクトであり、特定のStringインスタンスオブジェクトに対する特定の反復を表します。 Stringイテレータオブジェクトの名前付きコンストラクターはありません。 代わりに、Stringイテレータオブジェクトは、Stringインスタンスオブジェクトの特定のメソッドを呼び出すことによって作成されます。
21.1.5.1 CreateStringIterator ( string )
Stringオブジェクトのいくつかのメソッドは、Iteratorオブジェクトを返します。 引数文字列を使用した抽象操作CreateStringIteratorは、このようなイテレータオブジェクトを作成するために使用されます。 次の手順を実行します。
- Assert: Type(string) は String型
- OrdinaryObjectCreate(%StringIteratorPrototype%, « [[IteratedString]], [[StringNextIndex]] ») を iterator とする
- string を iterator.[[IteratedString]] にセットする
- 0 を iterator.[[StringNextIndex]] にセットする
- iterator を返す
21.1.5.2 The %StringIteratorPrototype% Object
%StringIteratorPrototype%は、次のような特徴があります。
- すべてのStringイテレータオブジェクトに継承されるプロパティがあります。
- 通常のオブジェクトです。
- [[Prototype]]内部スロットがあり、値は%IteratorPrototype% です。
- 以下のプロパティがあります。
21.1.5.2.1 %StringIteratorPrototype%.next ( )
- this値 を O とする
- Type(O) が Object型 でないなら、TypeError例外をスローする
- O が Stringイテレータインスタンス(21.1.5.3<\a>)のすべての内部スロットを持っていないなら、 TypeError例外をスローする
- O.[[IteratedString]] を s とする
- s が undefined なら、 CreateIterResultObject(undefined, true) を返す
- O.[[StringNextIndex]] を position とする
- s の長さを len とする
- position ≧ len なら、
- undefined を O.[[IteratedString]] にセットする
- CreateIterResultObject(undefined, true) を返す
- ! CodePointAt(s, position) を cp とする
- sのインデックスpositionから長さcp.[[CodeUnitCount]]の連続するコードユニットを含む文字列値を resultString とする
- position + cp.[[CodeUnitCount]] を O.[[StringNextIndex]] にセットする
- CreateIterResultObject(resultString, false) を返す
21.1.5.2.2 %StringIteratorPrototype% [ @@toStringTag ]
@@toStringTagプロパティの初期値は、文字列値"String Iterator"です。
このプロパティの属性は{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:true}です。
21.1.5.3 Stringイテレータインスタンスのプロパティ(Properties of String Iterator Instances)
Stringイテレータインスタンスは、%StringIteratorPrototype%組み込みオブジェクトからプロパティを継承する通常のオブジェクト
です。 Stringイテレータインスタンスは、最初に表53にリストされている内部スロットを使用して作成されます。
内部スロット | 内容 |
---|---|
[[IteratedString]] | コードユニットが繰り返されている文字列値。 |
[[StringNextIndex]] | このイテレータによって検査される次の文字列要素(コードユニット)の整数インデックス。 |
21.2 RegExp(正規表現)オブジェクト(RegExp (Regular Expression) Objects)
RegExpオブジェクトには、正規表現と関連するフラグが含まれています。
21.2.1 パターン(Patterns)
RegExpコンストラクターは、次の文法を入力パターン文字列に適用します。 文法が文字列をPatternの拡張として解釈できない場合、エラーが発生します。
構文:
Pattern[U, N] ::
SyntaxCharacter :: どれかひとつ
ControlEscape :: どれかひとつ
ControlLetter :: どれかひとつ
GroupName[U] ::
RegExpIdentifierName[U] ::
u LeadSurrogate との対応があいまいな \u TrailSurrogateは、対応する \u TrailSurrogate がない最も近い u LeadSurrogate に関連付けられるものとします。
NonSurrogate ::
NonemptyClassRanges[U] ::
NonemptyClassRangesNoDash[U] ::
21.2.1.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- NcapturingParens ≧ 232 - 1 なら構文エラー
- Patternに、RegExpIdentifierNameと同じStringValueを持つ複数のGroupSpecifierが含まれている場合、構文エラー
- 最初の DecimalDigits の MV が2番目の DecimalDigits の MV より大きいなら、構文エラー
AtomEscape ::
- Patternに、RegExpIdentifierNameを持つGroupSpecifierが含まれておらず、そのStringValueがこのプロダクションのGroupNameのRegExpIdentifierNameのStringValueと等しい場合は構文エラー
- DecimalEscapeのCapturingGroupNumberがNcapturingParens(21.2.2.1)より大きいなら、構文エラー
- 最初のClassAtomのIsCharacterClassがtrueであるか、2番目のClassAtomのIsCharacterClassがtrueの場合、構文エラー
- 最初のClassAtomのIsCharacterClassがfalseで、2番目のClassAtomのIsCharacterClassがfalseで、最初のClassAtomのCharacterValueが2番目のClassAtomのCharacterValueより大きい場合、構文エラー
- ClassAtomNoDashのIsCharacterClassがtrue、またはClassAtomのIsCharacterClassがtrueの場合は、構文エラー
- ClassAtomNoDashのIsCharacterClassがfalseで、ClassAtomのIsCharacterClassがfalseで、ClassAtomNoDashのCharacterValueがClassAtomのCharacterValueより大きい場合、構文エラー
RegExpIdentifierStart[U] ::
- RegExpUnicodeEscapeSequenceのCharacterValueが、"$" と "_" のコードポイント値、またはUnicodeIDStartレキシカル文法プロダクションと一致するコードポイントでない場合は、構文エラー
RegExpIdentifierStart[U] ::
- UnicodeLeadSurrogateとUnicodeTrailSurrogateがそれぞれ一致する2つのコードポイントでUTF16DecodeSurrogatePairを実行した結果が、UnicodeIDStartレキシカル文法プロダクションと一致しない場合は構文エラー
RegExpIdentifierPart[U] ::
- RegExpUnicodeEscapeSequenceのCharacterValueが "$"、 "_"、
、 のコードポイント値、またはUnicodeIDContinueレキシカル文法プロダクションと一致するコードポイントでない場合は、構文エラー
RegExpIdentifierPart[U] ::
- UnicodeLeadSurrogateとUnicodeTrailSurrogateがそれぞれ一致する2つのコードポイントでUTF16DecodeSurrogatePairを実行した結果が、UnicodeIDContinueレキシカル文法プロダクションと一致しない場合は構文エラー
- UnicodePropertyNameのSourceTextであるUnicodeコードポイントのリストが、表55の「プロパティ名とエイリアス」列にリストされているUnicodeプロパティ名またはプロパティエイリアスであるUnicodeコードポイントのリストと同一でない場合、構文エラー
- UnicodePropertyValueのSourceTextであるUnicodeコードポイントのリストが、対応する表の表57または表58の「プロパティ値とエイリアス」列でリストされた UnicodePropertyNameのSourceTextによって指定されたUnicodeプロパティまたはプロパティエイリアスの値または値エイリアスであるUnicodeコードポイントのリストと同一でない場合、構文エラー
- LoneUnicodePropertyNameOrValueのSourceTextであるUnicodeコードポイントのリストが、表57の「プロパティ値とエイリアス」列にリストされているUnicode一般カテゴリまたは一般カテゴリエイリアス、または表56の「プロパティ名とエイリアス」列にリストされているバイナリプロパティまたはバイナリプロパティエイリアスであるUnicodeコードポイントのリストと同一でない場合、構文エラー
21.2.1.2 静的セマンティクス(Static Semantics): CapturingGroupNumber
- NonZeroDigit の MV の 数値 を返す
- code points in DecimalDigits の コードポイントの 数学的整数 値を n とする
- ( NonZeroDigit の MV × 10n + DecimalDigits の MV ) の数値 を返す
「NonZeroDigitのMV」と「DecimalDigitsのMV」の定義は11.8.3にあります。
21.2.1.3 静的セマンティクス(Static Semantics): IsCharacterClass
ClassAtom ::
ClassEscape ::
ClassEscape ::
- false を返す
- true を返す
21.2.1.4 静的セマンティクス(Static Semantics): CharacterValue
ClassAtom ::
- コードポイント値 U+002D (HYPHEN-MINUS) を返す
- SourceCharacter に一致するコードポイントを ch とする
- コードポイント値 ch を返す
ClassEscape ::
- コードポイント値 U+0008 (BACKSPACE) を返す
ClassEscape ::
- コードポイント値 U+002D (HYPHEN-MINUS) を返す
- 表54に従ってコードポイント値を返す
ControlEscape | コードポイント値 | コードポイント | ユニコード名 | シンボル |
---|---|---|---|---|
t | 9 | U+0009 | CHARACTER TABULATION | <HT> |
n | 10 | U+000A | LINE FEED (LF) | <LF> |
v | 11 | U+000B | LINE TABULATION | <VT> |
f | 12 | U+000C | FORM FEED (FF) | <FF> |
r | 13 | U+000D | CARRIAGE RETURN (CR) | <CR> |
- ControlLetter に一致するコードポイントを ch とする
- ch のコードポイント値を i とする
- i を32で割った余りを返す
- コードポイント値 U+0000 (NULL) を返す
- HexEscapeSequence の SV のコードユニットの数値を返す
- LeadSurrogate の CharacterValue を lead とする
- TrailSurrogate の CharacterValue を trail とする
- UTF16DecodeSurrogatePair(lead, trail) を cp とする
- コードポイント値 cp を返す
- LeadSurrogate の CharacterValue を返す
- TrailSurrogate の CharacterValue を返す
- NonSurrogate の CharacterValue を返す
- Hex4Digits の MV の 数値を返す
- IdentityEscape に一致するコードポイントを ch とする
- コードポイント値 ch を返す
21.2.1.5 静的セマンティクス(Static Semantics): SourceText
- プロダクションに一致するソーステキスト内のUnicodeコードポイントのリストをソーステキスト順に返す
21.2.1.6 静的セマンティクス(Static Semantics): StringValue
RegExpIdentifierName[U] ::
- RegExpIdentifierName に 一致するソーステキスト を idText とする
- idText内の\ RegExpUnicodeEscapeSequence を、RegExpUnicodeEscapeSequence で表されるコードポイントに置き換えた結果を idTextUnescaped とする
- ! UTF16Encode(idTextUnescaped) を返す
21.2.2 パターンセマンティクス(Pattern Semantics)
正規表現パターンは、以下に説明するプロセスで抽象クロージャに変換されます。 実装では、結果が同じであるという条件で、この仕様よりも効率的なアルゴリズムを使用することをお勧めします。 抽象クロージャは、RegExpオブジェクトの[[RegExpMatcher]]内部スロットの値として使用されます。
フラグにuが含まれているかどうかで、Patternは、BMPパターンまたはUnicodeパターンのいずれかになります。 BMPパターンは、Basic Multilingual Planeの範囲内のUnicodeコードポイントである16ビット値のシーケンスで構成されている文字列と一致します。 Unicodeパターンは、UTF-16を使用してエンコードされたUnicodeコードポイントで構成されている文字列と一致します。 BMPパターンの動作を説明では、「文字」は単一の16ビットUnicode BMP コードポイントを意味します。 Unicodeパターンでは、「文字」はUTF-16でエンコードされたコードポイント(6.1.4)を意味します。 どちらの場合も、「文字値」とは、対応するエンコードされていないコードポイントの数値を意味します。
Patternの構文とセマンティクスは、PatternのソースコードがSourceCharacter値のリストであるかのように定義されます。各SourceCharacterはUnicodeコードポイントに対応します。 BMPパターンに非BMP SourceCharacter
が含まれている場合、パターン全体がUTF-16を使用してエンコードされ、そのエンコードの個々のコードユニットがリストの要素として使用されます。
例:ソーステキスト上パターンを単一の非BMP文字 U+1D11E(MUSICAL SYMBOL G CLEF)とする。
Unicodeパターンとして解釈されると、単一のコードポイント0x1D11Eで構成される単一の要素(文字)リストになります。 ただし、BMPパターンとして解釈されるため、最初にUTF-16でエンコードされ、コードユニット0xD834と0xDD1Eで構成される2要素のリストが生成されます。
パターンは、非BMP文字がUTF-16でエンコードされたECMAScript文字列値としてRegExpコンストラクターに渡されます。 たとえば、文字列値として表される単一文字のMUSICAL SYMBOL G CLEFパターンは、要素がコードユニット0xD834および0xDD1Eである長さ2の文字列です。 したがって、2つのパターン文字で構成されるBMPパターンとして文字列を処理するために、文字列をさらに変換する必要はありません。 ただし、Unicodeパターンとして処理するには、UTF16DecodeSurrogatePairを使用して、単一のパターン文字であるコードポイントU+1D11Eで構成されるリストを作成する必要があります。
実装上では、実際にはUTF-16との間でそのような変換を実行しない場合があります。しかし、この仕様のセマンティクスでは、パターンマッチングの結果において、このような変換が実行された状態である必要があります。
21.2.2.1 表記(Notation)
以下の説明では、次の変数を使用しています。
- Input:正規表現パターンと一致する文字列のすべての文字を順番に含むリストです。各文字は、関連するパターンの種類に応じて、コードユニットまたはコードポイントのいずれかになります。 Input[n]という表記は、Inputのn番目の文字を意味します。nの範囲は0からInputLength-1までです。
- InputLength:Inputの文字数です。
- NcapturingParens:パターン内の左側をキャプチャする括弧の総数(つまり、Atom :: ( GroupSpecifier Disjunction
) 解析ノードの総数)です。左をキャプチャする括弧は、任意の(Atom :: ( GroupSpecifier Disjunction) の終端記号) プロダクションと一致するパターン文字です。 - DotAll:RegExpオブジェクトの[[OriginalFlags]]内部スロットに"s"が含まれている場合はtrue、それ以外の場合はfalseです。
- IgnoreCase:RegExpオブジェクトの[[OriginalFlags]]内部スロットに"i"が含まれている場合はtrue、それ以外の場合はfalseです。
- Multiline:正規表現オブジェクトの[[OriginalFlags]]内部スロットに"m"が含まれている場合はtrue、それ以外の場合はfalseです。
- Unicode:RegExpオブジェクトの[[OriginalFlags]]内部スロットに"u"が含まれている場合はtrue、それ以外の場合はfalseです。
また、次の内部データ構造を使用しています。
- CharSet:Unicodeフラグの状態に応じて、コードユニットまたはコードポイントのいずれかの数学的な文字セットです。 「すべての文字」とは、Unicodeの状態に応じて、すべてのコードユニット値またはすべてのコードポイント値のいずれかを意味します。
- State:順序のあるペア(endIndex,captures)です。endIndexは整数、capturesはNcapturingParens値のリストです。Stateは、正規表現マッチングアルゴリズムで部分一致状態を表すために使用されます。 endIndexは、パターンがこれまでに一致した最後の入力文字のインデックスに1を加えたものです。capturesは括弧をキャプチャした結果を保持します。キャプチャのn番目の要素は、取得された値を表すリストです。ただし、キャプチャ未取得時はundefinedです。バックトラックのため、マッチング処理中は複数のStateが使用されている可能性があります。
- MatchResult:一致が失敗したことを示すState、または特別なトークンのfailureのどちらかです。
- Continuation:1つのState引数を取り、結果としてMatchResultを返す抽象クロージャです。 Continuationは、State引数で指定された中間状態から開始して、パターンの残りの部分(クロージャーのキャプチャされた値で指定)をInputと照合します。一致した場合、Continuationは到達した最終Stateを返します。一致がしなかった場合、Continuationはfailureを返します。
- Matcher:StateとContinuationの2つの引数を取り、MatchResultの結果を返す抽象クロージャです。State引数で指定された中間状態から開始して、パターンの中央のサブパターン(クロージャーのキャプチャされた値で指定)を入力と照合します。引数Continuationは、パターンの残りの部分と一致するクロージャです。パターンのサブパターンを照合して新しいStateを取得後、Matcherはその新しいStateでContinuationを呼び出して、パターンの残りの部分も一致するかどうかをテストします。可能であれば、MatcherはContinuationによって返されたStateを返します。そうでない場合、Matcherは選択ポイントでさまざまな選択を試み、成功するかすべての可能性が尽きるまでContinuationを繰り返し呼び出します。
21.2.2.2 パターン(Pattern)
次のプロダクションは、下記のアルゴリズムで評価します。
- Matcherm を取得するために、引数directionとして+1を使用してDisjunctionを評価する
- mをキャプチャし、パラメータ(str,index)で呼び出されると次の手順を実行する新しい抽象クロージャを返す
- Assert: Type(str) は String型
- Assert: ! IsNonNegativeInteger(index) は true で index ≦ strの長さ
- Unicode が true なら、! UTF16DecodeString(str) のコードポイントのシーケンスで構成されるリストを Input とする。 それ以外なら、strの要素であるコードユニットのシーケンスで構成されるリストを Input とする。Inputは、21.2.2のアルゴリズム全体で使用される。 Inputの各要素は文字と見なされる
- Input の文字数を InputLength とする。この変数は21.2.2のアルゴリズム全体で使用される
- strの要素indexから取得した文字のInputへのインデックスを listIndex とする
- 何もキャプチャせず、呼び出されたときに次の手順を実行するパラメータ(y)を持つ新しいContinuationを c とする
- Assert: y は State
- y を返す
- NcapturingParensのundefined値のリストを cap とする。NcapturingParensから1のインデックスが付けられる
- State (listIndex, cap) を x とする
- m(x, c) を呼び出し、結果を返す
21.2.2.3 Disjunction
引数 direction を使用。
次のプロダクションは、以下のアルゴリズムで評価します。
- 引数directionを使用してAlternativeを評価し、Matcher m を取得する
- m を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- 引数directionを使用してAlternativeを評価し、Matcher m1 を取得する
- 引数directionを使用してDisjunctionを評価し、Matcher m2 を取得する
- m1とm2をキャプチャし、パラメータ(x,c)で呼び出されると次の手順を実行する新しいMatcherを返す
| 正規表現演算子は、2つの選択肢を分離します。 パターンは最初に左側のAlternativeと一致するか検証します(その後に正規表現の続きが続きます)。 失敗した場合は、右側のDisjunctionと一致するか検証します(正規表現の続きが続きます)。 左側のAlternative、右側のDisjunction、および続きにすべて選択ポイントがある場合、左側の選択肢の次の選択肢に進む前に、後続のすべての選択肢が試されます。 左側のAlternativeの選択肢がなくなった場合、左側のAlternativeの代わりに右側のDisjunctionが試行されます。 | によってスキップされたパターン内のキャプチャ括弧は、文字列ではなくundefined値を生成します。
例えば、次のようなコードがあるとします。
/a|ab/.exec("abc")
この結果は、"ab" ではなく"a" です。
また、次のようなコードがあるとします。
/((a)|(ab))((c)|(bc))/.exec("abc")
これは、次のような配列を返します。
["abc", "a", "a", undefined, "bc", undefined, "bc"]
次のようには、なりません。
["abc", "ab", undefined, "ab", "c", "c", undefined]
2つの選択肢の検証順序は、direction値と無関係です。
21.2.2.4 Alternative
引数 direction を使用。
次のプロダクションは、以下のアルゴリズムで評価します。
次のプロダクションは、以下のアルゴリズムで評価します。
- 引数directionを使用してAlternative を評価し、Matcher m1を取得する
- 引数directionを使用してTerm を評価し、Matcher m2を取得する
- direction が +1 と等しいなら、
- 4. と異なるなら、
21.2.2.5 Term
引数 direction を使用。
次のプロダクションは、以下のアルゴリズムで評価します。
次のように評価します。
- Assertion を評価した結果であるMatcherを返す
次のプロダクションは、以下のアルゴリズムで評価します。
- 引数directionでAtomを評価した結果であるMatcherを返す
次のプロダクションは、以下のアルゴリズムで評価します。
Term ::
- 引数directionを使用してAtom を評価し、Matcher mを取得する
- Quantifierを評価して、整数min、整数(または∞)max、およびブール型greedyの3つの結果を取得する
- Assert: max が有限なら、 max は min 以上
- Termの左側にある正規表現全体の左側をキャプチャする括弧の数を、parenIndexとする。 これは、この用語の前またはそれを囲むAtom :: (GroupSpecifier Disjunction )解析ノードの総数
- Atomの左側をキャプチャする括弧の数をparenCountとする。 これは、Atomで囲まれたAtom :: (GroupSpecifier Disjunction )解析ノードの総数
- m と min と max と greedy と parenIndex と parenCount をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
- Assert: x は State
- Assert: c は Continuation
- RepeatMatcher(m, min, max, greedy, x, c, parenIndex, parenCount) をコールし、その結果を返す
21.2.2.5.1 ランタイムセマンティクス(Runtime Semantics): RepeatMatcher ( m, min, max, greedy, x, c, parenIndex, parenCount )
抽象演算RepeatMatcherは、Matcher m、整数 min、整数(または∞)max、ブール greedy、State x、Continuationc 、整数 parenIndex、整数 parenCount の8つのパラメーターを取り、次の手順を実行します。 :
- max がゼロなら、 c(x) を返す
- m と min と max と greedy と x と c と parenIndex と parenCount をキャプチャし、パラメータ(y)で呼び出されると次の手順を実行する新しいContinuationを d とする
- Assert: y は State
- min がゼロで y の endIndex が x の endIndex と等しいなら、 failure を返す
- min がゼロなら ゼロを、異なるなら min - 1 を min2 とする
- max が ∞ なら、 ∞を、異なるなら max - 1 を max2 とする
- RepeatMatcher(m, min2, max2, greedy, y, c, parenIndex, parenCount) をコールし、その結果を返す
- x の captures リストのコピーを cap とする
- parenIndex < k and k ≦ parenIndex + parenCount の条件を満たす全ての 整数 x について、 undefined を cap[k] にセットする
- x の endIndex を e とする
- State値 (e, cap) を xr とする
- min がゼロでないなら、 m(xr, d) を返す
- greedy が false なら、
- c(x) をコールし、その結果を z とする
- z が failure でないなら、 z を返す
- m(xr, d) をコールし、その結果を返す
- m(xr, d) をコールし、 その結果を z とする
- z が failure でないなら、 z を返す
- c(x) をコールし、その結果を返す
Atomと正規表現の後続すべてに選択ポイントがある場合、Atomは最初に可能な限り多くの(貪欲でない場合は少ない)回数一致します。 後続のすべての選択肢は、Atomの最後の繰り返しで次の選択肢に進む前に試行されます。 Atomの最後(n番目)の繰り返しのすべての選択は、Atomの最後から2番目(n-1)回目の繰り返しの次の選択に進む前に試行されます。 その時点で、Atomの繰り返しが多かれ少なかれ可能になることが判明する可能性があります。 これらは、Atomの(n-1)回目の繰り返しで次の選択肢に進む前に(ここでも、できるだけ少ないか、できるだけ多くから始めて)使い果たされます。
例:
/a[a-z]{2,4}/.exec("abcdefghi")
上の例は、"abced" を返します。
/a[a-z]{2,4}?/.exec("abcdefghi")
上の例は、"abc" を返します。
例:
/(aa|aabaac|ba|b|c)*/.exec("aabaac")
上の例は選択ポイントの順番で、次の配列を返します。
["aaba", "ba"]
次のようにはなりません。
["aabaac", "aabaac"]
["aabaac", "c"]
上記の選択ポイントの順序を使用して、2つの数値(1進表記で表される)の最大公約数を計算する正規表現を記述できます。 次の例では、10と15の公約数を計算します。
"aaaaaaaaaa,aaaaaaaaaaaaaaa".replace(/^(a+)\1*,\1+$/, "$1")
これは、最大公約数を1進表記"aaaaa"で返します。
RepeatMatcherのステップ4は、Atomが繰り返されるたびにAtomのキャプチャをクリアします。 正規表現でその動作を確認できます
/(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac")
上の例は、配列を返します。
["zaacbbbcac", "z", "ac", "a", undefined, "c"]
次のようにはなりません。
["zaacbbbcac", "z", "ac", "a", "bbb", "c"]
これは、最も外側の*を繰り返すたびに、定量化されたAtomに含まれるすべてのキャプチャされた文字列がクリアされるためです。この場合、2、3、4、および5の番号が付けられたキャプチャ文字列が含まれます。
RepeatMatcherのステップ2.aにより、最小繰り返し数が満たされると、空の文字シーケンスに一致するAtomの拡張は、それ以上の繰り返しとは見なされません。 これにより、正規表現エンジンが次のようなパターンで無限ループに陥るのを防ぎます。
例:
/(a*)*/.exec("b")
もっと複雑な例:
/(a*)b\1+/.exec("baaaac")
これは、次の配列を返します。
["b", ""]
21.2.2.6 Assertion
次のプロダクションは、以下のアルゴリズムで評価します。
Assertion ::
- 何もキャプチャせず、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
- Assert: x は State
- Assert: c は Continuation
- x の endIndex を e とする
- e がゼロまたは Multiline が true で、 Input[e - 1] が LineTerminator の一つなら、
- c(x) をコールし、その結果を返す
- failure を返す
次のプロダクションは、以下のアルゴリズムで評価します。
Assertion ::
- 何もキャプチャせず、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
- Assert: x は State
- Assert: c は Continuation
- x の endIndex を e とする
- e が InputLength と等しい、 または Multiline が true で、 Input[e] が LineTerminator の一つなら、
- c(x) をコールし、その結果を返す
- failure を返す
次のプロダクションは、以下のアルゴリズムで評価します。
Assertion ::
- 何もキャプチャせず、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
- Assert: x は State
- Assert: c は Continuation
- x の endIndex を e とする
- IsWordChar(e - 1) をコールし、 その結果(真偽値)を a とする
- IsWordChar(e) をコールし、 その結果(真偽値)を b とする
- a が true で、 b が false または a が false で b が true なら、
- c(x) をコールし、その結果を返す
- failure を返す
次のプロダクションは、以下のアルゴリズムで評価します。
Assertion ::
- 何もキャプチャせず、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
- Assert: x は State
- Assert: c は Continuation
- x の endIndex を e とする
- IsWordChar(e - 1) をコールし、その結果(真偽値)を a とする
- IsWordChar(e) をコールし、その結果(真偽値)を b とする
- a が true で、 b が true または a が false で b が false なら、
- c(x) をコールし、その結果を返す
- failure を返す
次のプロダクションは、以下のアルゴリズムで評価します。
Assertion ::
- 引数 direction として +1 を使用して Disjunctionを評価し、Matcherを取得する
- m をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
次のプロダクションは、以下のアルゴリズムで評価します。
Assertion ::
- 引数 direction として +1 を使用して Disjunction を評価し、 Matcher m を取得する
- m をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
次のプロダクションは、以下のアルゴリズムで評価します。
Assertion ::
- 引数 direction として -1 を使用し Disjunction を評価して Matcher m を取得する
- m をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
次のプロダクションは、以下のアルゴリズムで評価します。
Assertion ::
- 引数 direction として -1 を使用し Disjunction を評価して Matcher m を取得する
- m をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
21.2.2.6.1 ランタイムセマンティクス(Runtime Semantics): WordCharacters ( )
抽象操作WordCharacters は、次の手順を実行します。
- 次の63文字を含む文字セットを A をとする
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 _ - empty セット を U とする
- Canonicalize(c) が、A内にあるが、cが、A内にないという条件を満たす全ての c について c を U に追加する
- Assert: Unicode と IgnoreCase の両方が true でない限り、U は empty
- セット U の文字をセット A に追加する
- A を返す
21.2.2.6.2 ランタイムセマンティクス(Runtime Semantics): IsWordChar ( e )
抽象操作IsWordCharは、整数パラメーターeを受け取り、次の手順を実行します。
- e が -1 または e が InputLength なら、 false を返す
- Input[e] を c とする
- ! WordCharacters() の結果を wordChars とする
- c が wordChars 内にあるなら、 true を返す
- false を返す
21.2.2.7 Quantifier
次のプロダクションは、以下のアルゴリズムで評価します。
- QuantifierPrefix を評価して、整数 min と 整数(または∞)maxの2つの結果を取得する
- min、max、true の3つの結果を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- QuantifierPrefix を評価して、整数 min と 整数(または∞)maxの2つの結果を取得する
- min、max、false の3つの結果を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- 2つの結果、0 と ∞ を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- 2つの結果、 1 と ∞ を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- 2つの結果、 0 and 1 を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- DecimalDigits の MV (11.8.3) を i とする
- 2つの結果、 i と i を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- DecimalDigits の MV を i とする
- 2つの結果、 i と ∞ を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- 最初の DecimalDigits の MV を i とする
- 2番目の DecimalDigits の MV を j とする
- 2つの結果、 i と j を返す
21.2.2.8 Atom
引数 direction を使用。
次のプロダクションは、以下のアルゴリズムで評価します。
- PatternCharacter にマッチする文字を ch とする
- 文字 ch を含む1要素の CharSet を A とする
- CharacterSetMatcher(A, false, direction) をコールし、 結果の Matcher を返す
次のプロダクションは、以下のアルゴリズムで評価します。
Atom ::
- DotAll が true なら、
- すべての文字のセットを A とする
- 1. でなければ、 LineTerminator を除くすべての文字のセットを A とする
- CharacterSetMatcher(A, false, direction) をコールし、 結果の Matcher を返す
次のプロダクションは、以下のアルゴリズムで評価します。
Atom ::
- 引数 direction で AtomEscape を評価した結果の Matcher を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- CharacterClass を評価して、CharSet A とブール値 invert を取得する
- CharacterSetMatcher(A, invert, direction) をコールし、結果の Matcher を返す
次のプロダクションは、以下のアルゴリズムで評価します。
Atom ::
- 引数directionを使用してDisjunction を評価し、Matcher mを取得する
- Atom の左側にある正規表現全体の左側をキャプチャする括弧の数を parenIndex とします。 これは、Atom の前またはそれを囲むAtom :: (GroupSpecifier Disjunction ) 解析ノードの総数
- direction と m と parenIndex をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
- Assert: x は State
- Assert: c は Continuation
- x と c と direction と parenIndex をキャプチャし、パラメータ(y)で呼び出されると次の手順を実行する新しいContinuationを d とする
- m(x, d) をコールし、その結果を返す
次のプロダクションは、以下のアルゴリズムで評価します。
Atom ::
- 引数 direction で Disjunction を評価した結果である Matcher を返す
21.2.2.8.1 ランタイムセマンティクス(Runtime Semantics): CharacterSetMatcher ( A, invert, direction )
抽象演算CharacterSetMatcherは、CharSet A、ブールフラグ invert、整数 directionの3つの引数を取り、次の手順を実行します。
- A と invert と direction をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
- Assert: x は State
- Assert: c は Continuation
- x の endIndex を e とする
- e + direction を f とする
- f < 0 または f > InputLength なら failure を返す
- min(e, f) を index とする
- 文字 Input[index] を ch とする
- Canonicalize(ch) を cc とする
- invert が false なら、
- Canonicalize(a) が cc であるようなセット A のメンバー a が存在しないなら、failure を返す
- i. と異なるなら、
- Assert: invert は true
- Canonicalize(a) が cc であるようなセット A のメンバー a が存在するなら、 failure を返す
- x の captures リストを cap とする
- State値 (f, cap) を y とする
- c(y) をコールし、その結果を返す
21.2.2.8.2 ランタイムセマンティクス(Runtime Semantics): Canonicalize ( ch )
抽象操作Canonicalizeは、文字パラメーターchを受け取り、次のステップを実行します。
- IgnoreCase が false なら、 ch を返す
- Unicode が true なら、
- Unicode文字データベースのファイルCaseFolding.txtが、chの単純または一般的なケースフォールディングマッピングを提供するなら、そのマッピングを ch に適用した結果を返す
- ch を返す
- 2. と異なるなら、
形式 (?=Disjunction) は、ゼロ幅の正の先読みを指定します。 これが成功するためには、Disjunction内のパターンが現在の位置で一致する必要があります。ただし、現在の位置は後続と一致する前に進めることはできません。 Disjunctionが現在の位置で複数の方法により一致する場合、最初のものだけが試されます。 他の正規表現演算子とは異なり、(?= 形式へのバックトラックはありません(この異常な動作はPerlからの継承です)。これは、Disjunctionにキャプチャ括弧が含まれ、パターンの後続にそれらのキャプチャへの後方参照が含まれる場合にのみ問題になります。
例:
/(?=(a+))/.exec("baaabac")
上の例は、最初のbの直後の空の文字列と一致するため、次の配列を返します。
["", "aaa"]
先読みへのバックトラックの欠如を説明するために、以下を考慮してください。
/(?=(a+))a*b\1/.exec("baaabac")
上の例は、次の配列を返します。
["aba", "a"]
次のようにはなりません。
["aaaba", "a"]
フォーム(?!Disjunction)は、ゼロ幅の負の先読みを指定します。 これが成功するためには、Disjunction内のパターンが現在の位置で一致しない必要があります。 後続と一致する前に、現在の位置を進めることはできません。 Disjunctionにはキャプチャ括弧を含めることができます。ただし、それらへの後方参照はDisjunction自体の中からのみ意味があります。 パターンが成功するには負の先読みが失敗する必要があるため、パターンの他の場所からのこれらのキャプチャ括弧への逆参照は常にundefinedを返します。
例:
/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")
aの直後にない正の数nのa、a b、別のn a(最初の\ 2で指定)およびacを探します。 2番目の\ 2は負の先読みの外側にあるため、undefinedと一致します。そのため、常に成功します。 よって、式全体が次の配列を返します。
["baaabaac", "ba", undefined, "abaac"]
21.2.2.8.3 ランタイムセマンティクス(Runtime Semantics): UnicodeMatchProperty ( p )
抽象操作UnicodeMatchPropertyは、Unicodeコードポイントのリストであるパラメーターpを受け取り、次の手順を実行します。
実装は、表55と表56にリストされているUnicodeプロパティ名およびエイリアスをサポートする必要があります。相互運用性を確保するために、実装は他のプロパティ名またはエイリアスをサポートしてはいけません。
プロパティ名とエイリアス | 正規プロパティ名 |
---|---|
General_Category gc |
General_Category |
Script sc |
Script |
Script_Extensions scx |
Script_Extensions |
プロパティ名とエイリアス | 正規プロパティ名 |
---|---|
ASCII | ASCII |
ASCII_Hex_Digit AHex |
ASCII_Hex_Digit |
Alphabetic Alpha |
Alphabetic |
Any | Any |
Assigned | Assigned |
Bidi_Control Bidi_C |
Bidi_Control |
Bidi_Mirrored Bidi_M |
Bidi_Mirrored |
Case_Ignorable CI |
Case_Ignorable |
Cased | Cased |
Changes_When_Casefolded CWCF |
Changes_When_Casefolded |
Changes_When_Casemapped CWCM |
Changes_When_Casemapped |
Changes_When_Lowercased CWL |
Changes_When_Lowercased |
Changes_When_NFKC_Casefolded CWKCF |
Changes_When_NFKC_Casefolded |
Changes_When_Titlecased CWT |
Changes_When_Titlecased |
Changes_When_Uppercased CWU |
Changes_When_Uppercased |
Dash | Dash |
Default_Ignorable_Code_Point DI |
Default_Ignorable_Code_Point |
Deprecated Dep |
Deprecated |
Diacritic Dia |
Diacritic |
Emoji | Emoji |
Emoji_Component | Emoji_Component |
Emoji_Modifier | Emoji_Modifier |
Emoji_Modifier_Base | Emoji_Modifier_Base |
Emoji_Presentation | Emoji_Presentation |
Extended_Pictographic | Extended_Pictographic |
Extender Ext |
Extender |
Grapheme_Base Gr_Base |
Grapheme_Base |
Grapheme_Extend Gr_Ext |
Grapheme_Extend |
Hex_Digit Hex |
Hex_Digit |
IDS_Binary_Operator IDSB |
IDS_Binary_Operator |
IDS_Trinary_Operator IDST |
IDS_Trinary_Operator |
ID_Continue IDC |
ID_Continue |
ID_Start IDS |
ID_Start |
Ideographic Ideo |
Ideographic |
Join_Control Join_C |
Join_Control |
Logical_Order_Exception LOE |
Logical_Order_Exception |
Lowercase Lower |
Lowercase |
Math | Math |
Noncharacter_Code_Point NChar |
Noncharacter_Code_Point |
Pattern_Syntax Pat_Syn |
Pattern_Syntax |
Pattern_White_Space Pat_WS |
Pattern_White_Space |
Quotation_Mark QMark |
Quotation_Mark |
Radical | Radical |
Regional_Indicator RI |
Regional_Indicator |
Sentence_Terminal STerm |
Sentence_Terminal |
Soft_Dotted SD |
Soft_Dotted |
Terminal_Punctuation Term |
Terminal_Punctuation |
Unified_Ideograph UIdeo |
Unified_Ideograph |
Uppercase Upper |
Uppercase |
Variation_Selector VS |
Variation_Selector |
White_Space space |
White_Space |
XID_Continue XIDC |
XID_Continue |
XID_Start XIDS |
XID_Start |
21.2.2.8.4 ランタイムセマンティクス(Runtime Semantics): UnicodeMatchPropertyValue ( p, v )
抽象操作UnicodeMatchPropertyValueは、2つのUnicodeコードポイントのリストpとvをパラメーターとして取り、次の手順を実行します。
実装は、表57および表58にリストされているUnicodeプロパティ値の名前とエイリアスをサポートする必要があります。相互運用性を確保するために、実装は他のプロパティ値の名前またはエイリアスをサポートしてはいけません。
プロパティ値とエイリアス | 正規のプロパティ値 |
---|---|
Cased_Letter LC |
Cased_Letter |
Close_Punctuation Pe |
Close_Punctuation |
Connector_Punctuation Pc |
Connector_Punctuation |
Control Cc cntrl |
Control |
Currency_Symbol Sc |
Currency_Symbol |
Dash_Punctuation Pd |
Dash_Punctuation |
Decimal_Number Nd digit |
Decimal_Number |
Enclosing_Mark Me |
Enclosing_Mark |
Final_Punctuation Pf |
Final_Punctuation |
Format Cf |
Format |
Initial_Punctuation Pi |
Initial_Punctuation |
Letter L |
Letter |
Letter_Number Nl |
Letter_Number |
Line_Separator Zl |
Line_Separator |
Lowercase_Letter Ll |
Lowercase_Letter |
Mark M Combining_Mark |
Mark |
Math_Symbol Sm |
Math_Symbol |
Modifier_Letter Lm |
Modifier_Letter |
Modifier_Symbol Sk |
Modifier_Symbol |
Nonspacing_Mark Mn |
Nonspacing_Mark |
Number N |
Number |
Open_Punctuation Ps |
Open_Punctuation |
Other C |
Other |
Other_Letter Lo |
Other_Letter |
Other_Number No |
Other_Number |
Other_Punctuation Po |
Other_Punctuation |
Other_Symbol So |
Other_Symbol |
Paragraph_Separator Zp |
Paragraph_Separator |
Private_Use Co |
Private_Use |
Punctuation P punct |
Punctuation |
Separator Z |
Separator |
Space_Separator Zs |
Space_Separator |
Spacing_Mark Mc |
Spacing_Mark |
Surrogate Cs |
Surrogate |
Symbol S |
Symbol |
Titlecase_Letter Lt |
Titlecase_Letter |
Unassigned Cn |
Unassigned |
Uppercase_Letter Lu |
Uppercase_Letter |
プロパティ値とエイリアス | 正規のプロパティ値 |
---|---|
Adlam Adlm |
Adlam |
Ahom Ahom |
Ahom |
Anatolian_Hieroglyphs Hluw |
Anatolian_Hieroglyphs |
Arabic Arab |
Arabic |
Armenian Armn |
Armenian |
Avestan Avst |
Avestan |
Balinese Bali |
Balinese |
Bamum Bamu |
Bamum |
Bassa_Vah Bass |
Bassa_Vah |
Batak Batk |
Batak |
Bengali Beng |
Bengali |
Bhaiksuki Bhks |
Bhaiksuki |
Bopomofo Bopo |
Bopomofo |
Brahmi Brah |
Brahmi |
Braille Brai |
Braille |
Buginese Bugi |
Buginese |
Buhid Buhd |
Buhid |
Canadian_Aboriginal Cans |
Canadian_Aboriginal |
Carian Cari |
Carian |
Caucasian_Albanian Aghb |
Caucasian_Albanian |
Chakma Cakm |
Chakma |
Cham Cham |
Cham |
Cherokee Cher |
Cherokee |
Common Zyyy |
Common |
Coptic Copt Qaac |
Coptic |
Cuneiform Xsux |
Cuneiform |
Cypriot Cprt |
Cypriot |
Cyrillic Cyrl |
Cyrillic |
Deseret Dsrt |
Deseret |
Devanagari Deva |
Devanagari |
Dogra Dogr |
Dogra |
Duployan Dupl |
Duployan |
Egyptian_Hieroglyphs Egyp |
Egyptian_Hieroglyphs |
Elbasan Elba |
Elbasan |
Elymaic Elym |
Elymaic |
Ethiopic Ethi |
Ethiopic |
Georgian Geor |
Georgian |
Glagolitic Glag |
Glagolitic |
Gothic Goth |
Gothic |
Grantha Gran |
Grantha |
Greek Grek |
Greek |
Gujarati Gujr |
Gujarati |
Gunjala_Gondi Gong |
Gunjala_Gondi |
Gurmukhi Guru |
Gurmukhi |
Han Hani |
Han |
Hangul Hang |
Hangul |
Hanifi_Rohingya Rohg |
Hanifi_Rohingya |
Hanunoo Hano |
Hanunoo |
Hatran Hatr |
Hatran |
Hebrew Hebr |
Hebrew |
Hiragana Hira |
Hiragana |
Imperial_Aramaic Armi |
Imperial_Aramaic |
Inherited Zinh Qaai |
Inherited |
Inscriptional_Pahlavi Phli |
Inscriptional_Pahlavi |
Inscriptional_Parthian Prti |
Inscriptional_Parthian |
Javanese Java |
Javanese |
Kaithi Kthi |
Kaithi |
Kannada Knda |
Kannada |
Katakana Kana |
Katakana |
Kayah_Li Kali |
Kayah_Li |
Kharoshthi Khar |
Kharoshthi |
Khmer Khmr |
Khmer |
Khojki Khoj |
Khojki |
Khudawadi Sind |
Khudawadi |
Lao Laoo |
Lao |
Latin Latn |
Latin |
Lepcha Lepc |
Lepcha |
Limbu Limb |
Limbu |
Linear_A Lina |
Linear_A |
Linear_B Linb |
Linear_B |
Lisu Lisu |
Lisu |
Lycian Lyci |
Lycian |
Lydian Lydi |
Lydian |
Mahajani Mahj |
Mahajani |
Makasar Maka |
Makasar |
Malayalam Mlym |
Malayalam |
Mandaic Mand |
Mandaic |
Manichaean Mani |
Manichaean |
Marchen Marc |
Marchen |
Medefaidrin Medf |
Medefaidrin |
Masaram_Gondi Gonm |
Masaram_Gondi |
Meetei_Mayek Mtei |
Meetei_Mayek |
Mende_Kikakui Mend |
Mende_Kikakui |
Meroitic_Cursive Merc |
Meroitic_Cursive |
Meroitic_Hieroglyphs Mero |
Meroitic_Hieroglyphs |
Miao Plrd |
Miao |
Modi Modi |
Modi |
Mongolian Mong |
Mongolian |
Mro Mroo |
Mro |
Multani Mult |
Multani |
Myanmar Mymr |
Myanmar |
Nabataean Nbat |
Nabataean |
Nandinagari Nand |
Nandinagari |
New_Tai_Lue Talu |
New_Tai_Lue |
Newa Newa |
Newa |
Nko Nkoo |
Nko |
Nushu Nshu |
Nushu |
Nyiakeng_Puachue_Hmong Hmnp |
Nyiakeng_Puachue_Hmong |
Ogham Ogam |
Ogham |
Ol_Chiki Olck |
Ol_Chiki |
Old_Hungarian Hung |
Old_Hungarian |
Old_Italic Ital |
Old_Italic |
Old_North_Arabian Narb |
Old_North_Arabian |
Old_Permic Perm |
Old_Permic |
Old_Persian Xpeo |
Old_Persian |
Old_Sogdian Sogo |
Old_Sogdian |
Old_South_Arabian Sarb |
Old_South_Arabian |
Old_Turkic Orkh |
Old_Turkic |
Oriya Orya |
Oriya |
Osage Osge |
Osage |
Osmanya Osma |
Osmanya |
Pahawh_Hmong Hmng |
Pahawh_Hmong |
Palmyrene Palm |
Palmyrene |
Pau_Cin_Hau Pauc |
Pau_Cin_Hau |
Phags_Pa Phag |
Phags_Pa |
Phoenician Phnx |
Phoenician |
Psalter_Pahlavi Phlp |
Psalter_Pahlavi |
Rejang Rjng |
Rejang |
Runic Runr |
Runic |
Samaritan Samr |
Samaritan |
Saurashtra Saur |
Saurashtra |
Sharada Shrd |
Sharada |
Shavian Shaw |
Shavian |
Siddham Sidd |
Siddham |
SignWriting Sgnw |
SignWriting |
Sinhala Sinh |
Sinhala |
Sogdian Sogd |
Sogdian |
Sora_Sompeng Sora |
Sora_Sompeng |
Soyombo Soyo |
Soyombo |
Sundanese Sund |
Sundanese |
Syloti_Nagri Sylo |
Syloti_Nagri |
Syriac Syrc |
Syriac |
Tagalog Tglg |
Tagalog |
Tagbanwa Tagb |
Tagbanwa |
Tai_Le Tale |
Tai_Le |
Tai_Tham Lana |
Tai_Tham |
Tai_Viet Tavt |
Tai_Viet |
Takri Takr |
Takri |
Tamil Taml |
Tamil |
Tangut Tang |
Tangut |
Telugu Telu |
Telugu |
Thaana Thaa |
Thaana |
Thai Thai |
Thai |
Tibetan Tibt |
Tibetan |
Tifinagh Tfng |
Tifinagh |
Tirhuta Tirh |
Tirhuta |
Ugaritic Ugar |
Ugaritic |
Vai Vaii |
Vai |
Wancho Wcho |
Wancho |
Warang_Citi Wara |
Warang_Citi |
Yi Yiii |
Yi |
Zanabazar_Square Zanb |
Zanabazar_Square |
21.2.2.9 AtomEscape
引数 direction を使用。 The production
次のプロダクションは、以下のアルゴリズムで評価します。
- DecimalEscape を評価して整数 n を取得する
- Assert: n ≦ NcapturingParens
- BackreferenceMatcher(n, direction) をコールし、結果の Matcher を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- CharacterEscape を評価し、文字 ch を取得する
- 文字 ch を含む1要素の CharSet を A とする
- CharacterSetMatcher(A, false, direction) をコールし、結果の Matcher を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- CharacterClassEscape を評価し、 CharSet A を取得する
- CharacterSetMatcher(A, false, direction) をコールし、結果の Matcher を返す
次のプロダクションは、以下のアルゴリズムで評価します。
AtomEscape ::
次のように評価します。
- GroupNameに含まれるRegExpIdentifierNameのStringValueと等しいStringValueを持つRegExpIdentifierNameのGroupSpecifierのインスタンスを囲むパターンを検索する
- Assert:単一のGroupSpecifierが見つかった
- 配置されたGroupSpecifierの左側にある正規表現全体の左側をキャプチャする括弧の数を parenIndex とする。 これは、配置されたGroupSpecifierの前またはそれを囲む Atom :: (GroupSpecifier Disjunction ) 解析ノードの総数
- BackreferenceMatcher(parenIndex, direction) をコールし、 結果の Matcher を返す
21.2.2.9.1 ランタイムセマンティクス(Runtime Semantics): BackreferenceMatcher ( n, direction )
抽象操作BackreferenceMatcherは、整数nと整数directionの2つの引数を取り、次の手順を実行します。
- n と direction をキャプチャし、パラメータ(x, c)で呼び出されると次の手順を実行する新しいMatcherを返す
- Assert: x は State
- Assert: c は Continuation
- x の captures List を cap とする
- cap[n] を s とする
- s が undefined なら、 c(x) を返す
- x の endIndex を e とする
- s の要素数を len とする
- e + direction × len を f とする
- f < 0 または f > InputLength なら failure を返す
- min(e, f) を g とする
- i を0からlen-1までの整数としたとき、Canonicalize(s[i]) と Canonicalize(Input[g + i]) が同じ文字値にならないiが存在するなら、failure を返す
- State値 (f, cap) を y とする
- c(y) をコールし、その結果を返す
21.2.2.10 CharacterEscape
CharacterEscape プロダクションは、以下のアルゴリズムで評価します。
- CharacterEscape の CharacterValue を cv とする
- 文字値がcvの文字を返す
21.2.2.11 DecimalEscape
DecimalEscape プロダクションは、以下のアルゴリズムで評価します。
- DecimalEscape の CapturingGroupNumber を返す
21.2.2.12 CharacterClassEscape
次のプロダクションは、以下のアルゴリズムで評価します。
- 0から9までの文字を含む10要素の文字セットを返す
次のプロダクションは、以下のアルゴリズムで評価します。
- CharacterClassEscape :: dによって返されるセットに含まれていないすべての文字のセットを返す
次のプロダクションは、以下のアルゴリズムで評価します。
- WhiteSpace または LineTerminator プロダクションの右側にある文字を含む文字セットを返す
次のプロダクションは、以下のアルゴリズムで評価します。
- CharacterClassEscape :: s によって返されるセットに含まれていないすべての文字のセットを返す
次のプロダクションは、以下のアルゴリズムで評価します。
- WordCharacters() によって返されるすべての文字のセットを返す
次のプロダクションは、以下のアルゴリズムで評価します。
- CharacterClassEscape :: w によって返されるセットに含まれていないすべての文字セットを返す
次のプロダクションは、以下のアルゴリズムで評価します。
- UnicodePropertyValueExpression によって返されるCharSetが持つすべてのUnicodeコードポイントを含むCharSetを返す
次のプロダクションは、以下のアルゴリズムで評価します。
- UnicodePropertyValueExpression によって返されるCharSetに含まれていないすべてのUnicodeコードポイントを含むCharSetを返す
次のプロダクションは、以下のアルゴリズムで評価します。
- UnicodePropertyName の SourceText を ps とする
- ! UnicodeMatchProperty(ps) を p とする
- Assert: pは、表55の「プロパティ名とエイリアス」列にリストされているUnicodeプロパティ名またはプロパティエイリアス
- UnicodePropertyValue の SourceText を vs とする
- ! UnicodeMatchPropertyValue(p, vs) を v とする
- 文字データベース定義に値vのプロパティpが含まれているすべてのUnicodeコードポイントを含むCharSetを返す
次のプロダクションは、以下のアルゴリズムで評価します。
- LoneUnicodePropertyNameOrValue の SourceText を s とする
- ! UnicodeMatchPropertyValue(General_Category, s) が、表57の「プロパティ値とエイリアス」列にリストされているUnicode一般カテゴリまたは一般カテゴリエイリアスの名前であるUnicodeコードポイントのリストと同一なら、
- 文字データベース定義に値sのプロパティ"General_Category"が含まれているすべてのUnicodeコードポイントを含むCharSetを返返す
- ! UnicodeMatchProperty(s) を p とする
- Assert: p は、表56の「プロパティ名とエイリアス」列にリストされているバイナリUnicodeプロパティまたはバイナリプロパティエイリアス
- 文字データベース定義に値"True"のプロパティpが含まれているすべてのUnicodeコードポイントを含むCharSetを返す
21.2.2.13 CharacterClass
次のプロダクションは、以下のアルゴリズムで評価します。
- ClassRanges を評価し、 CharSet A を取得する
- 2つの結果 A と false を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- ClassRanges を評価し、 CharSet A を取得する
- 2つの結果 A と true を返す
21.2.2.14 ClassRanges
次のプロダクションは、以下のアルゴリズムで評価します。
- empty CharSet を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- NonemptyClassRanges の評価結果である CharSet を返す
21.2.2.15 NonemptyClassRanges
次のプロダクションは、以下のアルゴリズムで評価します。
- ClassAtom 評価した結果である CharSet を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- ClassAtom 評価して、 CharSet A を取得する
- NonemptyClassRangesNoDash 評価して、 CharSet B を取得する
- A and B 和集合を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- 最初の ClassAtom 評価して、 CharSet A を取得する
- 2番目の ClassAtom 評価して、 CharSet B を取得する
- ClassRanges 評価して、 CharSet C を取得する
- CharacterRange(A, B) をコールし、結果の CharSet を D とする
- D と C 和集合を返す
21.2.2.15.1 ランタイムセマンティクス(Runtime Semantics): CharacterRange ( A, B )
抽象操作CharacterRangeは、2つのCharSetパラメーターAおよびBを取り、次の手順を実行します。
21.2.2.16 NonemptyClassRangesNoDash
次のプロダクションは、以下のアルゴリズムで評価します。
- ClassAtom 評価した結果である CharSet を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- ClassAtomNoDash 評価して、 CharSet A を取得する
- NonemptyClassRangesNoDash 評価して、 a CharSet B を取得する
- A and B の和集合を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- ClassAtomNoDash 評価して、 a CharSet A を取得する
- ClassAtom 評価して、 CharSet B を取得する
- ClassRanges 評価して、 CharSet C を取得する
- CharacterRange(A, B) をコールし、 その結果の CharSet を D とする
- D と C の和集合を返す
21.2.2.17 ClassAtom
次のプロダクションは、以下のアルゴリズムで評価します。
ClassAtom ::
- 単一の文字 - U+002D (HYPHEN-MINUS)を含む CharSet をを返す
次のプロダクションは、以下のアルゴリズムで評価します。
- ClassAtomNoDash 評価した結果である CharSet を返す
21.2.2.18 ClassAtomNoDash
次のプロダクションは、以下のアルゴリズムで評価します。
- SourceCharacter と一致する文字を含む CharSet を返す
次のプロダクションは、以下のアルゴリズムで評価します。
- ClassEscape 評価した結果である CharSet を返す
21.2.2.19 ClassEscape
ClassEscape プロダクションは、以下のアルゴリズムで評価します。
ClassEscape ::
ClassEscape ::
- ClassEscape の CharacterValue を cv とする
- 文字値が cv の文字を c とする
- 単一の文字 c を含む CharSet を返す
- CharacterClassEscape 評価した結果である CharSet を返す
21.2.3 RegExpコンストラクター(The RegExp Constructor)
RegExpコンストラクターは、次の特徴があります。
- 組み込みオブジェクト%RegExp%です。
- グローバルオブジェクトの"RegExp"プロパティの初期値です。
- コンストラクターとしてではなく関数として呼び出されたときに、新しいRegExpオブジェクトを作成して初期化します。 したがって、関数呼び出しRegExp(…)は、同じ引数を持つオブジェクト作成式new RegExp(…)と同等です。
- サブクラス化できるように設計されています。 クラス定義のextends句の値として使用できます。 サブクラスコンストラクターには、必要な内部スロットとサブクラスインスタンスを作成および初期化するために、RegExpコンストラクターへのsuperコールを含める必要があります。
21.2.3.1 RegExp ( pattern, flags )
次の手順が実行されます。
- ? IsRegExp(pattern) を patternIsRegExp とする
- NewTarget が undefined なら、
- アクティブ関数オブジェクト を newTarget とする
- patternIsRegExp が true で、 flags が undefined なら、
- 2. と異なるなら、 NewTarget を newTarget とする
- Type(pattern) が Object型 で pattern が [[RegExpMatcher]] 内部スロットを持っているなら、
- pattern.[[OriginalSource]] を P とする
- flags が undefined なら、 pattern.[[OriginalFlags]] を F とする
- b. と異なるなら、 flags を F とする
- 4. と異なり、 patternIsRegExp が true なら、
- 5. と異なるなら、
- pattern を P とする
- flags を F とする
- ? RegExpAlloc(newTarget) を O とする
- ? RegExpInitialize(O, P, F) を返す
21.2.3.2 RegExpコンストラクターの抽象演算(Abstract Operations for the RegExp Constructor)
21.2.3.2.1 ランタイムセマンティクス(Runtime Semantics): RegExpAlloc ( newTarget )
引数newTargetを指定した抽象操作RegExpAllocが呼び出されると、次の手順が実行されます。
- ? OrdinaryCreateFromConstructor(newTarget, "%RegExp.prototype%", « [[RegExpMatcher]], [[OriginalSource]], [[OriginalFlags]] ») を obj とする
- ! DefinePropertyOrThrow(obj, "lastIndex",プロパティ記述子 {[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) を実行する
- obj を返す
21.2.3.2.2 ランタイムセマンティクス(Runtime Semantics): RegExpInitialize ( obj, pattern, flags )
引数obj、pattern、およびflagsを指定した抽象操作RegExpInitializeが呼び出されると、次の手順が実行されます。
- pattern が undefined なら、 empty String を P とする
- 1. と異なるなら、 ? ToString(pattern) を P とする
- flags が undefined なら、 empty String を F とする
- 3. と異なるなら、 ? ToString(flags) を F とする
- F に "g"、"i"、"m"、 "s"、"u"、"y" 以外のコードユニットが含まれている、または、同じコードユニットが複数回含まれているなら、 SyntaxError例外をスローする
- F に "u" が含まれているなら false を、異なるなら true を BMP とする
- BMP が true なら、
- P の16ビット要素のそれぞれをUnicode BMPコードポイントとして解釈したシーケンスを pText とする。UTF-16デコードは要素に適用しない
- 21.2.1の文法を使用して pText を解析する。 解析のゴールシンボルはPattern[~U, ~N]とする。 解析の結果にGroupNameが含まれているなら、ゴールシンボル Pattern[~U, +N]を使用して再解析し、その結果を適用する。 pTextが文法に準拠していない、pTextのいずれかの要素が解析によって一致しない、または早期エラー条件が存在するなら、SyntaxError例外をスローする
- 要素が P のコードユニット要素であるリストを patternCharacters とする
- 7. と異なるなら、
- ! UTF16DecodeString(P) を pText とする
- 21.2.1の文法を使用してpTextを解析する。 解析のゴールシンボルはPattern[+U, +N]とする。 pTextが文法に準拠していない、pTextのいずれかの要素が解析によって一致しない、または早期エラー条件が存在するなら、SyntaxError例外をスローする
- 要素が pText のコードポイントであるリストを patternCharacters とする
- P を obj.[[OriginalSource]] にセットする
- F を obj.[[OriginalFlags]] にセットする
- パターンのSourceCharacter値のリストとして patternCharacters を、フラグパラメータとして F を使用して、21.2.2のセマンティクスを適用し、上記の解析を評価する抽象クロージャ を obj.[[RegExpMatcher]] にセットする
- ? Set(obj, "lastIndex", 0, true) を実行する
- obj を返す
21.2.3.2.3 ランタイムセマンティクス(Runtime Semantics): RegExpCreate ( P, F )
引数PおよびFを指定した抽象操作RegExpCreateが呼び出されると、次の手順が実行されます。
- ? RegExpAlloc(%RegExp%) を obj とする
- ? RegExpInitialize(obj, P, F) を返す
21.2.3.2.4 ランタイムセマンティクス(Runtime Semantics): EscapeRegExpPattern ( P, F )
引数PおよびFを指定した抽象操作EscapeRegExpPatternが呼び出されると、次のようになります。
- UTF-16でエンコードされたUnicodeコードポイント(6.1.4)として解釈される P と同等の Pattern[~U](Fに"u"が含まれている場合はPattern[+U])の形式の文字列を S とする。 S は P と同一でない場合もある。 ただし、SをPattern[~U](Fに"u"が含まれている場合はPattern[+U])として評価した結果の抽象クロージャは、構築されたオブジェクトの[[RegExpMatcher]]内部スロットによって与えられる抽象クロージャと同じように動作する必要がある。P と F に同じ値を使用してこの抽象操作を複数回呼び出すと、同じ結果が得られる必要がある
- パターンで発生するコードポイント / またはLineTerminatorは、構築された正規表現と同じように動作するRegularExpressionLiteralとして、適切な字句コンテキストで、"/" と S と"/" と F の文字列連結を確実に解析できるように、必要に応じて S でエスケープする。たとえば、P が "/" の場合、S は "\/" または "\u002F" などの可能性があるが、"/" ではない。なぜなら、///の後にFが続くと、RegularExpressionLiteralではなくSingleLineCommentとして解析されるため。P が空の文字列の場合、S を "(?:)" にすることでこの仕様を満たすことができる
- S を返す
21.2.4 RegExpコンストラクターのプロパティ(Properties of the RegExp Constructor)
RegExpコンストラクターは、次の特徴があります。
- [[Prototype]]内部スロットがあり、値は%Function.prototype%である
- 以下のプロパティがある
21.2.4.1 RegExp.prototype
RegExp.prototypeの初期値は%RegExp.prototype%です。
このプロパティの属性は {[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}です。
21.2.4.2 get RegExp [ @@species ]
RegExp[@@ species]はsetアクセス関数がundefinedのアクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値 を返す
この関数の"name"プロパティの値は"get [Symbol.species]"です。
21.2.5 RegExpプロトタイプオブジェクトのプロパティ(Properties of the RegExp Prototype Object)
RegExpプロトタイプオブジェクトは、次の特徴があります。
- 組み込みオブジェクト%RegExpPrototype%です。
- 通常のオブジェクトです。
- RegExpインスタンスではありません。[[RegExpMatcher]]内部スロットや、RegExpインスタンスオブジェクトの他の内部スロットがありません。
- [[Prototype]]内部スロットがあり、値が%Object.prototype%です。
21.2.5.1 RegExp.prototype.constructor
RegExp.prototype.constructorの初期値は%RegExp%です。
21.2.5.2 RegExp.prototype.exec ( string )
正規表現に対してstringの正規表現マッチを実行し、その結果を含むArrayオブジェクトを返します。stringがマッチしなかった場合は、nullを返します。
文字列ToString(string)は、次のように正規表現パターンの出現を検索します。
- this値 を R とする
- ? RequireInternalSlot(R, [[RegExpMatcher]]) を実行する
- ? ToString(string) を S とする
- ? RegExpBuiltinExec(R, S) を返す
21.2.5.2.1 ランタイムセマンティクス(Runtime Semantics): RegExpExec ( R, S )
引数RおよびSを指定した抽象操作RegExpExecは、次の手順を実行します。
21.2.5.2.2 ランタイムセマンティクス(Runtime Semantics): RegExpBuiltinExec ( R, S )
引数RおよびSを指定した抽象操作RegExpBuiltinExec は、次の手順を実行します。
- Assert: R は初期化されたRegExpインスタンス
- Assert: Type(S) は String型
- S のコードユニット数を length とする
- ? ToLength(? Get(R, "lastIndex")) を lastIndex とする
- R.[[OriginalFlags]] を flags とする
- flags に "g" が含まれているなら true を、異なるなら、 false を global とする
- flags に "y" が含まれているなら true を、異なるなら、 false を sticky とする
- global が false で、 sticky が false なら、 0 を lastIndex にセット
- R.[[RegExpMatcher]] を matcher とする
- If flags に "u" が含まれているなら true を、異なるなら false を fullUnicode とする
- false を matchSucceeded とする
- matchSucceeded が false の間繰り返し
- lastIndex > length なら、
- matcher(S, lastIndex) を r とする
- r が failure なら、
- sticky が true なら、
- AdvanceStringIndex(S, lastIndex, fullUnicode) を lastIndex にセットする
- c. と異なるなら、
- Assert: r は State
- true を matchSucceeded にセットする
- r の endIndex 値 を e とする
- fullUnicode が true なら、
- matcherでマッチした S から派生した、Input文字リストへのインデックスを e とする。 Inputの要素eの文字に対応するSへの最小のインデックスを eUTF とする。 eがInputの要素数以上なら、eUTF はSのコードユニット数である
- eUTF を e にセットする
- global が true か sticky が true なら、
- r の captures リストの要素数を n とする (これは21.2.2.1の NcapturingParensと同じ値)
- Assert: n < 232 - 1
- ! ArrayCreate(n + 1) を A とする
- Assert: A の "length" プロパティの値は n + 1
- ! CreateDataPropertyOrThrow(A, "index", lastIndex) を実行する
- ! CreateDataPropertyOrThrow(A, "input", S) を実行する
- 一致した部分文字列を matchedSubstr とする(SのオフセットlastIndexからe-1までの部分)
- ! CreateDataPropertyOrThrow(A, "0", matchedSubstr) を実行する
- R GroupName のどれかを含んでいるなら、
- OrdinaryObjectCreate(null) を groups とする
- 24. と異なるなら、
- undefined を groups とする
- ! CreateDataPropertyOrThrow(A, "groups", groups) を実行する
- i > 0 と i ≦ n を満たす整数 i について、それぞれ次を処理する
- r の captures リストの i番目の要素を captureI とする
- captureI が undefined なら、 undefined を capturedValue とする
- b. と異なり、 fullUnicode が true なら、
- Assert: captureI は コードポイントのリスト
- ! UTF16Encode(captureI) を capturedValue とする
- c. と異なるなら、
- ! CreateDataPropertyOrThrow(A, ! ToString(i), capturedValue) を実行する
- R の i番目のキャプチャ― が GroupName で定義されているなら、
- 対応する RegExpIdentifierName の StringValue を s とする
- ! CreateDataPropertyOrThrow(groups, s, capturedValue) を実行する
- A を返す
21.2.5.2.3 AdvanceStringIndex ( S, index, unicode )
引数S、index、unicodeを指定した抽象操作AdvanceStringIndexは、次の手順を実行します。
21.2.5.3 get RegExp.prototype.dotAll
RegExp.prototype.dotAll はsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値 を R とする
- Type(R) が Object型でないなら、TypeError例外をスローする
- R が [[OriginalFlags]] 内部スロットを持っていないなら、
- SameValue(R, %RegExp.prototype%) が true なら、 undefined を返す
- TypeError例外をスローする
- R.[[OriginalFlags]] を flags とする
- flags が コードユニット 0x0073 (LATIN SMALL LETTER S) を含んでいるなら true を返す
- false を返す
21.2.5.4 get RegExp.prototype.flags
RegExp.prototype.flagsはsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値を R とする
- Type(R) がObject型でないなら、TypeError例外をスローする
- empty String を result とする
- ! ToBoolean(? Get(R, "global")) を global とする
- global が true なら コードユニット 0x0067 (LATIN SMALL LETTER G) を result に追加する
- ! ToBoolean(? Get(R, "ignoreCase")) を ignoreCase とする
- ignoreCase が true なら コードユニット 0x0069 (LATIN SMALL LETTER I) を result に追加する
- ! ToBoolean(? Get(R, "multiline")) を multiline とする
- multiline が true なら コードユニット 0x006D (LATIN SMALL LETTER M) を result に追加する
- ! ToBoolean(? Get(R, "dotAll")) を dotAll とする
- dotAll が true なら コードユニット 0x0073 (LATIN SMALL LETTER S) を result に追加する
- ! ToBoolean(? Get(R, "unicode")) を unicode とする
- unicode is true なら コードユニット 0x0075 (LATIN SMALL LETTER U) を result に追加する
- ! ToBoolean(? Get(R, "sticky")) を sticky とする
- sticky が true なら コードユニット 0x0079 (LATIN SMALL LETTER Y) を result に追加する
- result を返す
21.2.5.5 get RegExp.prototype.global
RegExp.prototype.globalはsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値を R とする
- Type(R) が Object型でない なら、TypeError例外をスローする
- R が [[OriginalFlags]] 内部スロットを持っていないなら、
- SameValue(R, %RegExp.prototype%) が true なら、 undefined を返す
- TypeError例外をスローする
- R.[[OriginalFlags]] を flags とする
- flags に コードユニット 0x0067 (LATIN SMALL LETTER G) が含まれているなら true を返す
- false を返す
21.2.5.6 get RegExp.prototype.ignoreCase
RegExp.prototype.ignoreCaseはsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値を R とする
- Type(R) が Object型でない なら、TypeError例外をスローする
- R が [[OriginalFlags]] 内部スロットを持っていないなら、
- SameValue(R, %RegExp.prototype%) が true なら、 undefined を返す
- TypeError例外をスローする
- R.[[OriginalFlags]] を flags とする
- flags に コードユニット 0x0069 (LATIN SMALL LETTER I) が含まれているなら true を返す
- false を返す
21.2.5.7 RegExp.prototype [ @@match ] ( string )
@@match が引数 string で呼び出されると、次の手順が実行されます。
- this値 を rx とする
- Type(rx) が Object型でない なら、TypeError例外をスローする
- ? ToString(string) を S とする
- ! ToBoolean(? Get(rx, "global")) を global とする
- global が false なら、
- ? RegExpExec(rx, S) を返す
- 5. と異なるなら、
- Assert: global は true
- ! ToBoolean(? Get(rx, "unicode")) を fullUnicode とする
- ? Set(rx, "lastIndex", 0, true) を実行する
- ! ArrayCreate(0) を A とする
- 0 を n とする
- 繰り返す
- ? RegExpExec(rx, S) を result とする
- result が null なら、
- n = 0 なら null を返す
- A を返す
- ii. と異なるなら、
この関数の"name"プロパティの値は"[Symbol.match]"です。
21.2.5.8 RegExp.prototype [ @@matchAll ] ( string )
@@matchAll が引数 string で呼び出されると、次の手順が実行されます。
- this値 を R とする
- Type(R) が Object型でないなら、TypeError例外をスローする
- ? ToString(string) を S とする
- ? SpeciesConstructor(R, %RegExp%) を C とする
- ? ToString(? Get(R, "flags")) を flags とする
- ? Construct(C, « R, flags ») を matcher とする
- ? ToLength(? Get(R, "lastIndex")) を lastIndex とする
- ? Set(matcher, "lastIndex", lastIndex, true) を実行する
- flags が "g" を含んでいるなら true を global とする
- 9. と異なるなら、 false を global とする
- flags が "u" を含んでいるなら true を fullUnicode とする
- 11. と異なるなら、 false を fullUnicode とする
- ! CreateRegExpStringIterator(matcher, S, global, fullUnicode) を返す
この関数の"name"プロパティの値は"[Symbol.matchAll]"です。
21.2.5.8.1 CreateRegExpStringIterator ( R, S, global, fullUnicode )
抽象操作CreateRegExpStringIteratorは、イテレータオブジェクトを作成するために使用されます。 次の手順を実行します。
- Assert: Type(S) は String
- Assert: Type(global) は Boolean
- Assert: Type(fullUnicode) は Boolean
- OrdinaryObjectCreate(%RegExpStringIteratorPrototype%, « [[IteratingRegExp]], [[IteratedString]], [[Global]], [[Unicode]], [[Done]] ») を iterator とする
- R を iterator.[[IteratingRegExp]] にセットする
- S を iterator.[[IteratedString]] にセットする
- global を iterator.[[Global]] にセットする
- fullUnicode を iterator.[[Unicode]] にセットする
- false を iterator.[[Done]] にセットする
- iterator を返す
21.2.5.9 get RegExp.prototype.multiline
RegExp.prototype.multilineはsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値を R とする
- Type(R) が Object型でない なら、TypeError例外をスローする
- R が [[OriginalFlags]] 内部スロットを持っていないなら、
- SameValue(R, %RegExp.prototype%) が true なら、 undefined を返す
- TypeError例外をスローする
- R.[[OriginalFlags]] を flags とする
- flags に コードユニット 0x006D (LATIN SMALL LETTER M) が含まれているなら true を返す
- false を返す
21.2.5.10 RegExp.prototype [ @@replace ] ( string, replaceValue )
@@replaceメソッドが引数stringとreplaceValueを使用して呼び出されると、次の手順が実行されます。
- this値 を rx とする
- Type(rx) が Object型でないなら、TypeError例外をスローする
- ? ToString(string) を S とする
- コードユニット S の要素数を lengthS とする
- IsCallable(replaceValue) を functionalReplace とする
- functionalReplace が false なら、
- ! ToBoolean(? Get(rx, "global")) を global とする
- global が true なら、
- 空の新規List を results とする
- false を done とする
- done が false の間繰り返し
- ? RegExpExec(rx, S) を result とする
- result が null なら true を done にセットする
- b. と異なるなら、
- result を results の最後に追加する
- global が false なら true を done にセットする
- ii. と異なるなら、
- empty String 値 を accumulatedResult とする
- 0 を nextSourcePosition とする
- results の 各要素を result とし、result ごとに次を実行する
- ? LengthOfArrayLike(result) を nCaptures とする
- max(nCaptures - 1, 0) を nCaptures にセットする
- ? ToString(? Get(result, "0")) を matched とする
- matched のコードユニット数を matchLength とする
- ? ToInteger(? Get(result, "index")) を position とする
- max( min(position, lengthS), 0) を position にセットする
- 1 を n とする
- 空の新規List を captures とする
- n ≦ nCaptures の間繰り返し
- ? Get(result, "groups") を namedCaptures とする
- functionalReplace が true なら、
- k. と異なるなら、
- namedCaptures が undefined でないなら、
- ? GetSubstitution(matched, S, position, captures, namedCaptures, replaceValue) を replacement とする
- position ≧ nextSourcePosition なら、
- NOTE: 通常、positionは後方に移動しない。 そうでないなら、RegExpサブクラスの動作が正しくないか、アクセスによってトリガーされる副作用により、rxのグローバルフラグまたはその他の特性を変更していることを示している。 この場合、対応する置換は無視される
- accumulatedResult と S の nextSourcePosition からposition -1 までのコードユニットで構成される文字列 と replacement の文字列連結を accumulatedResult にセットする
- position + matchLength を nextSourcePosition にセットする
- nextSourcePosition ≧ lengthS なら accumulatedResult を返す
- accumulatedResult と S の nextSourcePosition から最後までのコードユニットで構成される文字列の文字列連結を返す
この関数の"name"プロパティの値は"[Symbol.replace]"です。
21.2.5.11 RegExp.prototype [ @@search ] ( string )
@@search が引数 string で呼び出されると、次の手順が実行されます。
- this値 を rx とする
- Type(rx) が Object型でないなら、TypeError例外をスローする
- ? ToString(string) を S とする
- ? Get(rx, "lastIndex") を previousLastIndex とする
- SameValue(previousLastIndex, 0) が false なら、
- ? RegExpExec(rx, S) を result とする
- ? Get(rx, "lastIndex") を currentLastIndex とする
- SameValue(currentLastIndex, previousLastIndex) が false なら、
- result が null なら、 -1 を返す
- ? Get(result, "index") を返す
この関数の"name"プロパティの値は"[Symbol.search]"です。
21.2.5.12 get RegExp.prototype.source
RegExp.prototype.sourceはsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値 を R とする
- Type(R) が Object型でないなら、TypeError例外をスローする
- R が [[OriginalSource]] 内部スロットを持っていないなら、
- SameValue(R, %RegExp.prototype%) が true なら、 "(?:)" を返す
- TypeError例外をスローする
- Assert: R [[OriginalFlags]] 内部スロットがある
- R.[[OriginalSource]] を src とする
- R.[[OriginalFlags]] を flags とする
- EscapeRegExpPattern(src, flags) を返す
21.2.5.13 RegExp.prototype [ @@split ] ( string, limit )
stringを文字列に変換し、結果の部分文字列が格納されているArrayオブジェクトを返します。 部分文字列は、this値の正規表現の一致を左から右に検索することで決定されます。 一致部分は、返される配列に含まれませんが、文字列値を分割するために使用されます。
this値が空の正規表現または空の文字列の場合があります。このとき、正規表現は入力文字列の最初または最後の空の部分文字列と一致しません。また、直前に一致した区切り文字の最後の空の部分文字列とも一致しません。 (たとえば、正規表現が空の文字列の場合、文字列は個々のコードユニット要素に分割されます。結果の配列の長さは文字列の長さと等しく、各部分文字列には1つのコード単位が含まれます。)最初の一致のみ 文字列の特定のインデックスで、バックトラックがそのインデックスで空でない部分文字列の一致を生成する可能性がある場合でも考慮されます。 (たとえば、/a*?/[Symbol.split]("ab")は配列["a", "b"]と評価され、/a*/[Symbol.split]( "ab")は 配列["", "b"]と評価されます。)
stringが空の文字列の場合、結果は正規表現が空の文字列と一致するかどうかによって異なります。 可能であれば、結果の配列には要素が含まれていません。 それ以外の場合、結果の配列には空の文字列である1つの要素が含まれます。
正規表現にキャプチャー括弧が含まれている場合、separatorが一致するたびに、キャプチャー括弧の結果(undefinedの結果を含む)が出力配列にスプライスされます。
例:
/<(\/)?([^<>]+)>/[Symbol.split]("A<B>bold</B>and<CODE>coded</CODE>")
上の例は、配列に評価されます。
["A", undefined, "B", "bold", "/", "B", "and", undefined, "CODE", "coded", "/", "CODE", ""]
limitがundefinedでない場合、出力配列は切り捨てられ、limit個の要素のみが含まれるようになります。
@@split メソッドが呼び出されると、次の手順が実行されます。
- this値 を rx とする
- Type(rx) が Object型でないなら、TypeError例外をスローする
- ? ToString(string) を S とする
- ? SpeciesConstructor(rx, %RegExp%) を C とする
- ? ToString(? Get(rx, "flags")) を flags とする
- flags が "u" を含んでいるなら true を unicodeMatching とする
- 6. と異なるなら、 false を unicodeMatching とする
- Iflags が "y" を含んでいるなら flags を newFlags とする
- 8. と異なるなら、 flags と "y" の文字列連結を newFlags とする
- ? Construct(C, « rx, newFlags ») を splitter とする
- ! ArrayCreate(0) を A とする
- 0 を lengthA とする
- limit が undefined なら、 232 - 1 を、異なるなら ? ToUint32(limit) を lim とする
- S の長さを size とする
- 0 を p とする
- lim = 0 なら A を返す
- size = 0 なら、
- ? RegExpExec(splitter, S) を z とする
- z が null でないなら、 A を返す
- ! CreateDataPropertyOrThrow(A, "0", S) を実行する
- A を返す
- p を q とする
- q < size の間繰り返し
- ? Set(splitter, "lastIndex", q, true) を実行する
- ? RegExpExec(splitter, S) を z とする
- z が null なら AdvanceStringIndex(S, q, unicodeMatching) を q にセットする
- c. と異なるなら、
- ? ToLength(? Get(splitter, "lastIndex")) を e とする
- min(e, size) を e にセットする
- e = p なら AdvanceStringIndex(S, q, unicodeMatching) を q にセットする
- iii. と異なるなら、
- S のインデックスpから q - 1 までのコードユニットで構成される文字列に等しい文字列値を T とする
- ! CreateDataPropertyOrThrow(A, ! ToString(lengthA), T) を実行する
- lengthA + 1 を lengthA にセットする
- lengthA = lim なら A を返す
- e を p にセットする
- ? LengthOfArrayLike(z) を numberOfCaptures とする
- max(numberOfCaptures - 1, 0) を numberOfCaptures にセットする
- 1 を i とする
- i ≦ numberOfCaptures の間繰り返し
- p を q にセットする
- S のインデックス p から size -1 までのコードユニットで構成される文字列に等しい文字列値を T とする
- ! CreateDataPropertyOrThrow(A, ! ToString(lengthA), T) を実行する
- A を返す
この関数の"name"プロパティの値は"[Symbol.split]"です。
21.2.5.14 get RegExp.prototype.sticky
RegExp.prototype.stickyはsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値を R とする
- Type(R) が Object型でない なら、TypeError例外をスローする
- R が [[OriginalFlags]] 内部スロットを持っていないなら、
- SameValue(R, %RegExp.prototype%) が true なら、 undefined を返す
- TypeError例外をスローする
- R.[[OriginalFlags]] を flags とする
- flags に コードユニット 0x0079 (LATIN SMALL LETTER Y) が含まれているなら true を返す
- false を返す
21.2.5.15 RegExp.prototype.test ( S )
次の手順が実行されます。
- this値 を R とする
- Type(R) が Object型でないなら、TypeError例外をスローする
- ? ToString(S) を string とする
- ? RegExpExec(R, string) を match とする
- match が null でないなら、 true を、異なるなら false を返す
21.2.5.16 RegExp.prototype.toString ( )
21.2.5.17 get RegExp.prototype.unicode
RegExp.prototype.unicodeはsetアクセス関数がundefinedの アクセサプロパティ です。 getアクセス関数は、次の手順を実行します。
- this値を R とする
- Type(R) が Object型でない なら、TypeError例外をスローする
- R が [[OriginalFlags]] 内部スロットを持っていないなら、
- SameValue(R, %RegExp.prototype%) が true なら、 undefined を返す
- TypeError例外をスローする
- R.[[OriginalFlags]] を flags とする
- flags に コードユニット 0x0075 (LATIN SMALL LETTER U) が含まれているなら true を返す
- false を返す
21.2.6 RegExpインスタンスのプロパティ(Properties of RegExp Instances)
RegExpインスタンスは、RegExpプロトタイプオブジェクトからプロパティを継承する通常のオブジェクトです。RegExpインスタンスには、内部スロット[[RegExpMatcher]]、[[OriginalSource]]、および[[OriginalFlags]]があります。[[RegExpMatcher]]内部スロットの値は、RegExpオブジェクトのPatternの抽象クロージャです。
RegExpインスタンスには、以下のプロパティがあります。
21.2.6.1 lastIndex
"lastIndex"プロパティの値は、次にマッチを開始する文字列インデックスです。 使用すると整数に強制変換されます(21.2.5.2.2を参照)。 このプロパティの属性は、{[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:false}です。
21.2.7 RegExp文字列イテレータオブジェクト(RegExp String Iterator Objects)
RegExp文字列イテレータはオブジェクトで、特定のStringインスタンスオブジェクトに対する特定の反復を表し、特定のRegExpインスタンスオブジェクトと照合します。RegExp文字列イテレータオブジェクトには名前付きコンストラクターがありません。代わりに、RegExpインスタンスオブジェクトの特定のメソッドを呼び出すことによって作成されます。
21.2.7.1 %RegExpStringIteratorPrototype%オブジェクト(The %RegExpStringIteratorPrototype% Object)
%RegExpStringIteratorPrototype%オブジェクトは、次の特徴があります。
- すべてのRegExp文字列イテレータオブジェクトに継承されるプロパティがあります。
- 通常のオブジェクトです。
- [[Prototype]]内部スロットがあり、その値は組み込みオブジェクト%IteratorPrototype% です。
- 以下のプロパティがあります。
21.2.7.1.1 %RegExpStringIteratorPrototype%.next ( )
- this値 を O とする
- Type(O) が Object型でないなら、TypeError例外をスローする
- O がRegExp文字列イテレータオブジェクトインスタンスの内部スロット(21.2.7.2)を持っていないなら TypeError例外をスローする
- O.[[Done]] が true なら、
- ! CreateIterResultObject(undefined, true) を返す
- O.[[IteratingRegExp]] を R とする
- O.[[IteratedString]] を S とする
- O.[[Global]] を global とする
- O.[[Unicode]] を fullUnicode とする
- ? RegExpExec(R, S) を match とする
- match が null なら、
- true を O.[[Done]] にセットする
- ! CreateIterResultObject(undefined, true) を返す
- 10. と異なるなら、
- global が true なら、
- a. と異なるなら、
- true を O.[[Done]] にセットする
- ! CreateIterResultObject(match, false) を返す
21.2.7.1.2 %RegExpStringIteratorPrototype% [ @@toStringTag ]
@@toStringTagプロパティの初期値は、文字列値"RegExpStringIterator"です。
このプロパティの属性は{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:true}です。
21.2.7.2 RegExp文字列イテレータインスタンスのプロパティ(Properties of RegExp String Iterator Instances)
RegExp文字列イテレータインスタンスは、%RegExpStringIteratorPrototype%組み込みオブジェクトからプロパティを継承する通常のオブジェクトです。 RegExp文字列イテレータインスタンスは、最初に表59にリストされている内部スロットが作成されます。
内部スロット | 内容 |
---|---|
[[IteratingRegExp]] | 反復に使用される正規表現。 IsRegExp([[IteratingRegExp]])は最初はtrueです。 |
[[IteratedString]] | 繰り返される文字列値。 |
[[Global]] | [[IteratingRegExp]]がグローバルかどうかを示すブール値。 |
[[Unicode]] | [[IteratingRegExp]]がUnicodeモードであるかどうかを示すブール値。 |
[[Done]] | 反復が完了したかどうかを示すブール値。 |